Python模块变得太大了
我的模块都在一个大文件中,很难维护。打破现状的标准方式是什么 我在一个文件Python模块变得太大了,python,python-module,Python,Python Module,我的模块都在一个大文件中,很难维护。打破现状的标准方式是什么 我在一个文件my_module.py中有一个模块,我这样导入它: import my_module “my_模块”很快就会有上千行,这将限制我保持一切正常的能力。我正在考虑添加文件my_module_base.py,my_module_blah.py,等等,然后用 from my_module_base import * from my_module_blah import * # etc. 然后,用户代码不需要更改: impor
my_module.py
中有一个模块,我这样导入它:
import my_module
“my_模块”很快就会有上千行,这将限制我保持一切正常的能力。我正在考虑添加文件my_module_base.py
,my_module_blah.py
,等等,然后用
from my_module_base import *
from my_module_blah import *
# etc.
然后,用户代码不需要更改:
import my_module # still works...
这是标准模式吗?我肯定对此有很多意见,但我想说的是,您可以将其分解为包含在一个包中的定义更明确的功能单元(模块)。然后使用:
from mypackage import modulex
然后使用包名称引用对象:
modulex.MyClass()
等等
你应该(几乎)永远不要使用
from mypackage import *
因为这可能会引入bug(来自不同模块的重复名称最终会导致一个错误) 这取决于模块实际执行的操作。通常,最好将模块设置为一个目录,其中包含“
\uuu init\uuuu.py”
文件。因此,首先要将your\u module.py
转换为类似your\u module/\uuuu init\uuuu.py
之后,您将根据您的业务逻辑继续。这里有一些例子:
- 您是否有模块API不直接使用的实用程序函数?请将它们放入名为
utils.py的文件中
- 您是否有一些处理数据库或表示数据库模型的类将它们放入
models.py
- 您是否有一些内部配置将其放入名为
或settings.py
config.py
这些只是示例(从可重用应用程序的Django方法中偷了一点)。如前所述,这在很大程度上取决于模块的功能。如果之后它仍然太大,那么创建子模块(作为具有自己的
\uuu init\uuu.py
的子目录)也是有意义的 不,这不是标准模式<代码>从导入的内容导入*通常不是一个好的做法,因为它会导入很多您不想导入的内容。
取而代之的是采用与您相同的方法,但具体包括从一个模块到另一个模块,例如
在base.py中,如果您使用的是def myfunc
,那么在main.py中使用“从base导入myfunc”,这样对于您的用户来说,
main.myfunc`也可以工作。当然,您需要注意不要以循环导入结束
另外,如果您看到需要导入*的
,请使用\uuuu all\uuuu
结构控制导入值。谢谢您的回答。我不确定我的问题是否措辞得体。请看我最近的编辑。好的,当然。但是用户需要一切吗?有时,为了进行转换,您可以提供一个额外的向后兼容模块,将所有内容都纳入其中。这是“几乎”的例外虽然这可能并不总是合适的,但您也可以使用mypackage import modulex中的格式作为mx
或其他较短的名称。您也可以通过从mypackage中添加(!)来显式导入常用名称。modulex import MyClass
等-几乎没有名称冲突风险,因为您一眼就能看到所有导入的名称,但是对于用户来说更方便。当有人导入我的模块时,除了源代码\uuuu init\uuuu.py
之外还会发生什么?如果没有,我会在我的\uuu init\uuuuuuuuuuuuuupy
中放入类似blah import*
的语句吗?您可以这样做,但正如这里所述,这不是一个好的做法。请参阅下面Senthil Kumaran关于如何更好地执行的回答。导入您的模块在执行导入my_模块时应向外部提供的内容。其他一切都应该“隐藏”在模块逻辑中。