Python模块变得太大了

时间:2011-04-27 04:32:43

标签: python python-module

我的模块是一个很难维护的大文件。什么是打破事情的标​​准方法?

我在文件my_module.py中有一个模块,我这样导入:

import my_module

“my_module”将很快成为千行,这正在推动我保持一切顺利的能力极限。我在考虑添加文件my_module_base.pymy_module_blah.py等。然后,用

替换my_module.py
from my_module_base import *
from my_module_blah import *
# etc.

然后,用户代码无需更改:

import my_module  # still works...

这是标准模式吗?

3 个答案:

答案 0 :(得分:4)

这取决于您的模块实际上在做什么。通常,最好将模块设置为内部带有“__init__.py'文件的目录。因此,您首先要将your_module.py转换为类似your_module/__init__.py的内容。

之后,您将继续根据您的业务逻辑。这里有一些例子:

  • 你有没有直接被模块API使用的实用程序函数将它们放在一个名为utils.py的文件中

  • 您是否有一些类处理数据库或表示您的数据库模型将它们放入models.py

  • 您是否有一些内部配置可能会将其放入名为settings.pyconfig.py

  • 的额外文件中

这些只是示例(从可重复使用的应用程序的Django方法中有点被盗^^)。如上所述,它取决于你的模块做了多少。如果它之后仍然太大,那么创建子模块(作为具有自己的__init__.py的子目录)也是有意义的。

答案 1 :(得分:2)

我确信对此有很多意见,但我会说你把它分解成包含在包中的更明确的功能单元(模块)。然后你使用:

from mypackage import modulex

然后使用包名称引用对象:

modulex.MyClass()

等。

你应该(几乎)永远不要使用

from mypackage import *

因为那可能会引入错误(来自不同模块的重复名称将最终破坏一个)。

答案 2 :(得分:1)

不,这不是标准模式。 from something import *通常不是一个好习惯,因为它会导入很多你不想要的东西。 而是采用与您相同的方法,但是将模块特别地从一个模块包含到另一个模块中,例如

在base.py中,如果你有def myfunc那么在main.py中使用'from base import myfunc So that for your users, main.myfunc`也可以。当然,您需要注意不要最终进行循环导入。

此外,如果您发现需要from something import *,则使用__all__构造控制导入值。