Python模块变得太大了

3 投票
3 回答
3071 浏览
提问于 2025-04-16 16:29

我的模块现在都放在一个很大的文件里,维护起来越来越困难。有什么标准的方法可以把它拆分开吗?

我有一个模块在一个文件里,叫做 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 个回答

1

不,这不是标准的写法。from something import * 通常不是个好习惯,因为这样会导入很多你并不想要的东西。相反,应该像你之前做的那样,明确地从一个模块导入到另一个模块,比如:

base.py 里,如果你有 def myfunc,那么在 main.py 里就用 from base import myfunc。这样,对于你的用户来说,main.myfunc 也能正常工作。当然,你需要注意不要出现循环导入的问题。

另外,如果你发现必须使用 from something import *,那么可以通过 __all__ 这个构造来控制导入的内容。

2

我相信大家对此有很多看法,但我觉得可以把它拆分成更明确的功能单元(模块),放在一个包里。然后你可以使用:

from mypackage import modulex

接着用包的名字来引用这个对象:

modulex.MyClass()

等等。

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

from mypackage import *

因为这样可能会引入错误(来自不同模块的重复名称会互相覆盖)。

5

这要看你的模块具体在做什么。一般来说,把你的模块做成一个文件夹,并在里面放一个叫做'__init__.py'的文件是个不错的主意。所以你可以把你的your_module.py改成your_module/__init__.py

之后,你可以根据自己的业务逻辑继续进行。这里有一些例子:

  • 如果你有一些工具函数,但这些函数并不是模块接口直接用的,可以把它们放在一个叫utils.py的文件里。

  • 如果你有一些类是用来处理数据库的,或者是表示你的数据库模型的,可以把它们放在models.py里。

  • 如果你有一些内部配置,放在一个额外的文件里,比如叫settings.py或者config.py,也是有意义的。

这些只是一些例子(有点借鉴了Django可重用应用的做法^^)。正如所说的,这很大程度上取决于你的模块在做什么。如果模块之后还是太大,创建子模块(作为子文件夹,并有自己的__init__.py)也是个好主意。

撰写回答