正确导入Python模块

时间:2009-05-22 02:09:07

标签: python python-import

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

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

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

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

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

4 个答案:

答案 0 :(得分: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

明确清单。没有魔法。没有动态更改sys.path

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

答案 1 :(得分:6)

几个指针

  1. 您可能已经拆分了 各种模块的功能。如果 你大部分时间都正确地完成了 不会属于循环导入 问题(例如,如果模块a取决于 在b和b上,你可以做第三个 模块c删除这样的循环 依赖)。作为最后的手段,在一个 导入b但在b中导入a 需要a的点,例如内 功能

  2. 一旦功能正常 模块将它们分组在包中 一个子目录并添加一个__init__.py文件 它,以便您可以导入 包。保持这样的包装 文件夹lib然后添加 到sys.path或设置PYTHONPATH env 变量

  3. 来自模块导入*可能不会 好主意。相反,导入任何东西 需要。它可能是完全合格的。它 啰嗦并不痛苦。例如 来自pakageA.moduleB导入 CoolClass。

答案 2 :(得分:4)

这样做的方法是避免魔法。换句话说,如果您的模块需要来自另一个模块的东西,它应该显式导入它。你不应该依赖自动导入的东西。

正如Python的禅宗(import this)所拥有的那样,显性比隐含更好。

答案 3 :(得分:3)

您不会在导入时获得递归,因为Python会缓存每个模块,并且不会重新加载已经存在的模块。