Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python模块变得太大了_Python_Python Module - Fatal编程技术网

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_模块时应向外部提供的内容。其他一切都应该“隐藏”在模块逻辑中。