Pythonic组织模块和包的方式

时间:2009-11-26 06:28:00

标签: python module package project-organization

我来自一个背景,我通常每个类创建一个文件。我也在目录下组织公共类。这种做法对我来说很直观,并且已被证明在C ++,PHP,JavaSript等中有效。

我无法将这个比喻带入Python:文件不仅仅是文件,而是正式的模块。在一个模块中只有一个类似乎是不对的 - 大多数类本身都是无用的。如果我有一个automobile.py和一个Automobile类,那么总是将它引用为automobile.Automobile似乎很愚蠢。

但是,与此同时,将大量代码放入一个文件并将其称为一天似乎是不对的。显然,一个非常复杂的应用程序应该有超过5个文件。

什么是正确的 - 或pythonic ---方式? (或者,如果没有正确的方法,您首选的方式是什么?为什么?)我应该在Python模块中投入多少代码?

5 个答案:

答案 0 :(得分:32)

从“包装的逻辑单元”来看 - 可能是一个单独的类,但更多时候是一组密切合作的类。类(或模块级函数 - 当模块级函数也可作为选择时,不要通过使用静态方法“在Python中执行Java”! - )可以根据此标准进行分组。基本上,如果A的大多数用户也需要B,反之亦然,A和B应该在同一个模块中;但是如果许多用户只需要其中一个而不需要另一个,那么它们应该位于不同的模块中(可能在同一个包中,即其中包含__init__.py文件的目录)。

标准的Python库虽然远非完美,但往往反映(大多数)合理的良好实践 - 因此您可以通过示例来学习它。例如,threading模块当然定义了一个Thread类......但是它还包含同步原语类,如锁,事件,条件和信号量,以及可以是的异常类。通过线程操作(以及更多的东西)引发的。它处于合理大小的上限(800行,包括空格和文档字符串),并且一些与线程相关的关键功能(如Queue)已被放置在一个单独的模块中,但它仍然是一个很好的例子,它仍然有意义的最大功能打包成单个模块。

答案 1 :(得分:9)

如果你想坚持你的每个文件系统(这是合乎逻辑的,不要误解我的意思),你可能会做这样的事情,以避免引用automobile.Automobile:< / p>

from automobile import Automobile
car = Automobile()

然而,正如cobbal所提到的,每个文件不止一个类在Python中很常见。无论哪种方式,只要你选择一个合理的系统并持续使用它,我认为任何Python用户都不会对你生气:)。

答案 2 :(得分:8)

如果您从c ++的角度来看,您可以查看类似于.so或.dll的python模块。是的,它们看起来像源文件,因为python是脚本化的,但它们实际上是可加载的特定功能库。

另一个可能有用的比喻是你可能会将python模块看作命名空间。

答案 3 :(得分:4)

在一个中型项目中,我发现自己有几组密切相关的课程。其中一些集现在被分组到文件中;例如,低级网络类都在一个network模块中。但是,一些最大的类已被拆分为自己的文件。

从每个文件的一个历史记录开始这条路径的最佳方法可能是将通常放在同一目录中的类放在同一个文件中。如果该文件开始看起来太大,请将其拆分。

答案 4 :(得分:3)

作为一个模糊的指导方针:每个文件超过1个类是python的标准

另见How many Python classes should I put in one file?