我在Python代码库中使用了很多namedtuple
,而且它们遍布.py
个文件。将所有这些声明提取到一个单独的文件中是不是一个好的做法,还是应该保留在它们使用的位置?
在少数情况下,其他模块需要使用在单独模块中引用namedtuples
,因为这是接口的定义方式 - 它们期望namedtuples
。什么是组织各种namedtuples
的Pythonic方法,尤其是跨模块引用?
答案 0 :(得分:4)
用于决定命名元组放置位置的思维过程与用于任何其他代码行的思维过程没有什么不同:
模块定义逻辑功能单元。某些代码段可能永远不需要知道另一段代码或与另一段代码交互。这些边界线的识别强烈暗示了将代码分解为模块的位置。
模块封装了一个接口。它们使您有机会定义API,通过该API,所有其他代码段进行交互,同时隔离模块中其实现的详细信息。隔离模块中的代码可以更容易地在您想要在保留API的同时更改实现时知道在哪里集中注意力。
一旦您确定了逻辑单元(即模块)和逻辑单元将通过其进行交互的API,就应该更清楚地放置命名元组的位置。
如果一个模块X
需要导入另一个模块Y
,除了命名元组的定义之外没有其他原因,那么将namedtuples放在一个单独的模块中是有意义的, Z
,因为您找到了边界线。
但是,如果X
无论如何都需要导入Y
,那么如果将命名元素放在一个单独的模块中,那么它真的不会有太大的区别,因为在import Y
的任何地方你也import Z
。
现在,X
通常不需要所有 Y
提供的功能,因此您可能会想要将X
的较小位分开。 {1}}需要进入一个单独的模块。但是在经过一定程度的分解后,它自己的模块就变得疯狂了 - 拥有许多小模块而不是一个中型模块变得更加繁重。那条线路 - 确切地说是中等大小 - 是一个品味问题,也是你想象的功能逻辑单元。