Python模块变得太大了
我的模块现在都放在一个很大的文件里,维护起来越来越困难。有什么标准的方法可以把它拆分开吗?
我有一个模块在一个文件里,叫做 my_module.py
,我这样导入它:
import my_module
这个“my_module”文件很快就会有一千行代码,这让我很难理清楚所有的内容。我在考虑添加一些文件,比如 my_module_base.py
、my_module_blah.py
等等。然后,把 my_module.py
替换成:
from my_module_base import *
from my_module_blah import *
# etc.
这样,用户的代码就不需要做任何改变:
import my_module # still works...
这样做是标准的做法吗?
3 个回答
不,这不是标准的写法。from something import *
通常不是个好习惯,因为这样会导入很多你并不想要的东西。相反,应该像你之前做的那样,明确地从一个模块导入到另一个模块,比如:
在 base.py
里,如果你有 def myfunc
,那么在 main.py
里就用 from base import myfunc
。这样,对于你的用户来说,main.myfunc
也能正常工作。当然,你需要注意不要出现循环导入的问题。
另外,如果你发现必须使用 from something import *
,那么可以通过 __all__
这个构造来控制导入的内容。
我相信大家对此有很多看法,但我觉得可以把它拆分成更明确的功能单元(模块),放在一个包里。然后你可以使用:
from mypackage import modulex
接着用包的名字来引用这个对象:
modulex.MyClass()
等等。
你应该(几乎)永远不要使用
from mypackage import *
因为这样可能会引入错误(来自不同模块的重复名称会互相覆盖)。
这要看你的模块具体在做什么。一般来说,把你的模块做成一个文件夹,并在里面放一个叫做'__init__.py
'的文件是个不错的主意。所以你可以把你的your_module.py
改成your_module/__init__.py
。
之后,你可以根据自己的业务逻辑继续进行。这里有一些例子:
如果你有一些工具函数,但这些函数并不是模块接口直接用的,可以把它们放在一个叫
utils.py
的文件里。如果你有一些类是用来处理数据库的,或者是表示你的数据库模型的,可以把它们放在
models.py
里。如果你有一些内部配置,放在一个额外的文件里,比如叫
settings.py
或者config.py
,也是有意义的。
这些只是一些例子(有点借鉴了Django可重用应用的做法^^)。正如所说的,这很大程度上取决于你的模块在做什么。如果模块之后还是太大,创建子模块(作为子文件夹,并有自己的__init__.py
)也是个好主意。