组织模块和包的 Pythonic 方式
Posted
技术标签:
【中文标题】组织模块和包的 Pythonic 方式【英文标题】:The Pythonic way of organizing modules and packages 【发布时间】:2010-12-20 14:06:26 【问题描述】:我的背景通常是每个班级创建一个文件。我也在目录下组织公共类。这种做法对我来说很直观,并且已被证明在 C++、php、JavaSript 等中是有效的。
我在将这个比喻引入 Python 时遇到了麻烦:文件不再只是文件,而是正式的模块。在一个模块中只包含一个类似乎是不对的——大多数类本身是无用的。如果我有一个 automobile.py
和一个 Automobile
类,那么总是将其引用为 automobile.Automobile
似乎很愚蠢。
但是,与此同时,将大量代码放入一个文件并收工似乎并不合适。显然,一个非常复杂的应用程序应该有 5 个以上的文件。
什么是正确的——或者pythonic——方式? (或者如果没有正确的方法,您首选的方法是什么?为什么?)我应该在 Python 模块中输入多少代码?
【问题讨论】:
复制:***.com/questions/1642975/… 复制:***.com/questions/106896/… 【参考方案1】:从“包装的逻辑单元”的角度来考虑——它可能是一个类,但更多时候是一组紧密合作的类。类(或模块级函数——当模块级函数也可用作选择时,不要“在 Python 中执行 Java”)始终使用静态方法!-)可以基于此标准进行分组。基本上,如果 A 的大多数用户也需要 B,反之亦然,那么 A 和 B 应该在同一个模块中;但如果许多用户只需要其中一个而不需要另一个,那么他们可能应该位于不同的模块中(可能在同一个包中,即其中包含 __init__.py
文件的目录)。
标准 Python 库虽然远非完美,但往往反映了(大部分)相当好的实践——因此您主要可以通过示例从中学习。例如,threading
模块当然定义了一个Thread
类......但它也包含同步原语类,如锁、事件、条件和信号量,以及一个可以由线程操作引发的异常类(还有更多的东西)。它处于合理大小的上限(800 行,包括空格和文档字符串),并且一些与线程相关的关键功能(例如 Queue)已放置在单独的模块中,但它是一个很好的例子,说明它仍然有意义的最大功能量打包成一个模块。
【讨论】:
【参考方案2】:如果你想坚持你的每个文件一个类的系统(这是合乎逻辑的,不要误会我的意思),你可以这样做以避免参考automobile.Automobile
:
from automobile import Automobile
car = Automobile()
然而,正如 cobbal 所提到的,在 Python 中每个文件有多个类是很常见的。无论哪种方式,只要您选择一个合理的系统并始终如一地使用它,我认为任何 Python 用户都不会生您的气:)。
【讨论】:
【参考方案3】:如果您从 c++ 的角度来看,您可以查看类似于 .so 或 .dll 的 python 模块。是的,它们看起来像源文件,因为 python 是脚本化的,但它们实际上是具有特定功能的可加载库。
另一个可能有帮助的比喻是您可能将 python 模块视为命名空间。
【讨论】:
【参考方案4】:在一个中型项目中,我发现自己有几组密切相关的类。其中一些集合现在被分组到文件中;例如,低级网络类都在单个network
模块中。但是,一些最大的类已被拆分到自己的文件中。
也许从每个文件一个类的历史开始沿着该路径开始的最佳方法是获取通常放置在同一目录中的类,而不是将它们保存在同一文件中。如果该文件开始看起来太大,请将其拆分。
【讨论】:
【参考方案5】:作为一个模糊的指导方针:每个文件超过 1 个类是 python 的标准
另外,请参阅How many Python classes should I put in one file?
【讨论】:
以上是关于组织模块和包的 Pythonic 方式的主要内容,如果未能解决你的问题,请参考以下文章