【问题标题】:Split large python file into module with common dependencies将大型 python 文件拆分为具有常见依赖项的模块
【发布时间】:2015-04-19 20:15:42
【问题描述】:

在 Flask 中进行开发时,我想将我所有的模型、控制器……放在它们自己的单独文件中。这样,我不必在大文件中寻找任何控制器、模型;它保持一切清洁。它可能如下所示:

/controllers
    __init__.py
    login.py
    logout.py
    profile.py

所有这些文件(几乎)具有相同的依赖关系。我不想一遍又一遍地将所有依赖项放在每个文件中。我想出的一种解决方案是使用depencies.py 文件,该文件导入所有依赖项,然后我将它们包含在每个单独的文件中。

 /controllers
    __init__.py
    dependencies.py (all the imports)
    login.py (import dependencies.py)
    logout.py (import dependencies.py)
    profile.py (import dependencies.py)

但是,这不是一个非常优雅的解决方案。我想知道是否可以做类似 __init__.py 之类的事情,它在顶部有依赖项,然后“包含”单独的文件,并且一切都以这种方式运行,因此您实际上不需要包含常见的依赖项在每个文件中。

我想做的事情的例子(不起作用):

#common dependencies
from app import mail
from flask import session
...
#actual models (which depend on these dependencies)
from user import User
from code import Code
from role import Role

【问题讨论】:

  • 我只是将每个模块的依赖项放在模块中。如果每个模块 A B C 具有所有相同的依赖关系 X Y Z,那么可能有一些常见的行为可以从 A B C 中提取到 D 中。然后 A B C 可以依赖于 D 而不是 X Y Z。

标签: python module


【解决方案1】:

文件特定的导入

仅在每个文件或您的文件中导入必要的依赖项。如果profile 只需要flask,则只导入文件中的那个。如果login.py 需要flaskapp,则将两者都导入该文件中。除非在__init__.py 的代码中实际使用了 3rd 方模块,否则您不需要将其导入那里。根据您最终使用包的方式,您可以在 __init__.py 中设置带有模块的 __all__ 列表。

参考资料:

  1. 导入只会加载一个模块一次。之后的任何导入都只需将其添加到当前命名空间。
    - another answer

  2. 出于效率原因,每个模块在每个解释器会话中只导入一次。
    - python docs

  3. __all__ explanation

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2011-08-30
    • 2016-09-16
    • 1970-01-01
    • 1970-01-01
    • 2016-08-22
    • 1970-01-01
    相关资源
    最近更新 更多