【问题标题】:Is it OK to exchange tuples between Python modules?在 Python 模块之间交换元组可以吗?
【发布时间】:2010-07-06 06:50:57
【问题描述】:

我有一个由非常少的模块(大约 4 个左右)组成的小型 Python 程序。主模块创建一个元组列表,从而表示许多记录。这些元组可通过一个简单的函数返回给其他模块(例如,get_records())。

我不确定这是否是好的设计。问题是其他模块需要知道元组中每个元素的索引。这增加了模块之间的耦合,并且对于想要使用主模块的人来说不是很透明。

我可以想到几个替代方案:

  1. 使元组元素的索引值可用作模块常量(例如,IDX_RECORD_TITLEIDX_RECORD_STARTDATE 等)。这避免了像 title = record[3] 这样的幻数的需要。

  2. 不要使用元组,而是创建一个记录类,并返回这些类对象的列表。优点是类方法将具有不言自明的名称,例如 record.get_title()

  3. 不要使用元组,而是使用字典。因此,在这种情况下,该函数将返回一个字典列表。优点是字典键也是不言自明的(尽管使用该模块的人需要知道它们)。但这似乎是一个巨大的开销。

我发现元组是 Python 的一大优势(非常容易传递复合数据而无需类/对象的编码开销),所以我目前使用 (1),但仍然想知道最好的方法是什么.

【问题讨论】:

    标签: python tuples coupling


    【解决方案1】:

    【讨论】:

    • namedtuple() :正是我想要的!谢谢。
    • 嗯,刚刚发现 namedtuple 在 Python 2.5 中不受支持(它们是在 2.6 中添加的),我使用它来兼容 Mac OS X。也许我无论如何都不得不求助于使用类...
    【解决方案2】:

    我没有看到通过元组传递对象的任何开销或复杂性(元组也是对象)

    如果 tuple 满足您的目的,IMO 可以轻松使用它,但是正如您所看到的,约束只是切换到一个干净地表示您的数据的类,例如

    class MyData(object):
        def __init__(self, title, desc):
            self.title = title
            self.desc = desc
    

    您无需添加任何 getter 或 setter 方法。

    【讨论】:

    • 我确实在考虑 getter 和 setter 的开销,但忘记了在 Python 中这并不是绝对必要的。
    【解决方案3】:

    在这些情况下,我倾向于使用字典。 如果我稍后回来使用代码时让自己容易理解的话。

    我不知道这是否是“巨大的开销”。我想这取决于你做它的频率和它的用途。我从最简单的解决方案开始,并在我真正需要时进行优化。令人惊讶的是,我很少需要更改类似的内容。

    【讨论】:

    • 开销将出现在每个“记录”中的字典键中。由于在我的情况下记录的数量永远不会很大(
    • 我同意这种感觉。 :) 我不知道我是否被 C++/Java 编程损坏了,但出于某种原因,让某种数据类保存这些值感觉更好。在某些情况下,这样做还有助于您的 IDE 完成代码。 :) 来自 gnibbler 的 namedtuple 建议似乎是一个不错的折衷方案。
    • 而且namedtuple 文档明确指出:命名元组实例没有每个实例的字典,因此它们是轻量级的,并且不需要比常规元组更多的内存。跨度>
    猜你喜欢
    • 2012-10-24
    • 2017-03-28
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 2013-04-15
    • 1970-01-01
    • 2010-11-07
    相关资源
    最近更新 更多