代码之家  ›  专栏  ›  技术社区  ›  chernevik

在python中正确导入模块

  •  11
  • chernevik  · 技术社区  · 15 年前

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

    我有一个中等大小的python应用程序,在不同的子目录中有模块文件。我已经创建了将这些子目录附加到 sys.path 并导入一组模块,使用 import thisModule as tm . 模块对象是通过该限定来引用的。然后我将该模块导入其他模块 from moduleImports import * . 代码现在是草率的,并且有一些这样的东西,它们经常是重复的。

    首先,应用程序失败,因为没有分配某些模块引用。当单元测试时,同样的代码也会运行。

    其次,我担心会导致递归模块导入出现问题。导入模块导入导入此模块,导入模块导入。….

    正确的方法是什么?

    4 回复  |  直到 11 年前
        1
  •  23
  •   S.Lott    15 年前

    “我有一个中等大小的python应用程序,在不同的子目录中包含模块文件。”

    很好。确保每个目录都包含 __init__.py 文件,以便它是一个包。

    “我已经创建了将这些子目录附加到 sys.path

    坏的。使用 PYTHONPATH 或安装整个结构 Lib/site-packages . 不要更新 搜索路径 动态地。这是件坏事。难以管理和维护。

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

    没有道理。也许你有一个 将此模块作为tm导入 对于结构中的每个模块。这是典型的标准实践:只导入您需要的模块,而不导入其他模块。

    “然后我将该模块导入其他模块, from moduleImports import *

    坏的。不要随便进口一堆东西。

    每个模块都应该有一个它所需要的具体内容的长列表。

    import this
    import that
    import package.module
    

    显式列表。没有魔法。无动态变化 搜索路径 .

    我目前的项目有100个模块,十几个左右的包。每个模块只导入它需要的内容。没有魔法。

        2
  •  6
  •   G S    14 年前

    少量指针

    1. 你可能已经分开了 各种模块的功能。如果 大部分时间你都做得很好 不属于循环进口 问题(例如,模块A是否取决于 在B和B上,你可以做第三个 移除此类圆形物的模块C 依赖关系)。作为最后手段, 导入B,但在B中导入A 需要A的点,例如内部 功能。

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

    3. 从模块导入*不能 好主意。相反,导入任何内容 是需要的。它可能是完全合格的。它 冗长一点也不疼。例如 从pakagea.moduleb导入 CoolClass。

        3
  •  4
  •   Daniel Roseman    15 年前

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

    作为巨蟒的禅宗( import this )有了它,显式比隐式好。

        4
  •  3
  •   Peter Mortensen Josh McGee    13 年前

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