正确导入Python模块

che*_*vik 11 python python-import

如何设置模块导入,以便每个模块可以访问所有其他模块的对象?

我有一个中型Python应用程序,其中包含各种子目录中的模块文件.我创建sys.path了一些模块,使用这些模块将这些子目录附加到并导入一组模块import thisModule as tm.模块对象与该限定条件一起引用.然后我将该模块导入到其他模块中from moduleImports import *.代码现在很草率,并且有几个这些东西,通常是重复的.

首先,应用程序失败,因为未分配某些模块引用.在单元测试时运行相同的代码.

其次,我担心我会导致递归模块导入问题.导入moduleImports导入thisModule,导入moduleImports....

这样做的正确方法是什么?

S.L*_*ott 23

"我有一个中型Python应用程序,在各个子目录中都有模块文件."

好.确保每个目录都包含一个__init__.py文件,这样它就是一个包.

"我创建了附加这些子目录的模块sys.path"

坏.使用PYTHONPATH或安装整个结构Lib/site-packages.不要sys.path动态更新.这是件坏事.难以管理和维护.

"导入一组模块,使用import thisModule as tm."

没有意义.也许你import thisModule as tm的结构中的每个模块都有一个.这是典型的标准做法:只导入您需要的模块,而不导入其他模块.

"然后我将该模块导入其他模块中from moduleImports import *"

坏.不要随意导入一堆随机的东西.

每个模块都应该有一个很长的列表,列出它需要的具体事项.

import this
import that
import package.module
Run Code Online (Sandbox Code Playgroud)

明确的清单.没有魔法.没有动态变化sys.path.

我目前的项目有100个模块,十几个包.每个模块都可以输入所需的内容.没有魔法.

  • 用一句话来说:"明确比隐含更好". (4认同)

Anu*_*yal 6

几个指针

  1. 您可能已经在各种模块中拆分了功能.如果在大多数情况下正确完成,您将不会陷入循环导入问题(例如,如果模块a依赖于b和b,则可以创建第三个模块c以消除此类循环依赖性).作为最后的手段,在导入b中但在b中导入a需要a的位置,例如内部函数.

  2. 一旦功能正确地在模块中将它们分组到子目录下的包中__init__.py并向其添加文件,以便您可以导入包.将这些包装保存在文件夹(例如lib)中,然后添加到sys.path或设置PYTHONPATH env变量

  3. 从模块导入*可能不是一个好主意.相反,导入所需的一切.它可能是完全合格的.啰嗦并不痛苦.例如,从pakageA.moduleB导入CoolClass.