2015-04-19 35 views
5

在Flask中开发时,我想将我的所有模型,控制器......放在它们自己的单独文件中。这样,我不必寻找任何控制器,在一个大文件模型;它保持一切清洁。它可能如下所示:将大型python文件拆分为具有公共依赖关系的模块

/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 
+0

我只是把每一个模块的依赖关系的模块中。如果每个模块A B C具有所有相同的依赖关系X Y Z,那么可能有一些常见行为可以从A B C中提取出来并转换为D.然后,A B C可以取决于D而不是X Y Z. –

回答

1

文件中的特定进口

只导入所需的依赖关系。如果profile只需要flask,则只导入该文件中的文件。如果login.py需要flaskapp,请在该文件中导入。除非在__init__.py的代码中实际使用了方模块,否则不需要将其导入到那里。取决于你最终如何使用你的软件包,你可以在__init__.py中设置你的模块的__all__列表。

参考文献:

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

  2. 对于效率的原因,每个模块仅每解释器会话导入一次。
    - python docs

  3. __all__ explanation