首页 文章

如何在__init__.py文件中导入当前模块?

提问于
浏览
1
package
    1) module1
    2) module2
    3) module3
    4) __init__.py

我想做的是

  • import package

  • 然后我可以直接使用 module1module2 中的一些子模块,看起来好像我是按照以下方式导入的:

import module1

如果我在 __init__.py 中使用 imp.load_module 来加载 module1 ,那么 dir(package1) 将在 sys.modules 中有 "module1""module2" ,但我仍然需要使用 package.modules1 来访问它 . 我注意到当我导入 package 时,我会得到一个 'module' 对象包 . 如果我更新包的内置方法,它将欺骗系统使 module1 可见 .

>>> import package
>>> package.__dict__.update(package.module1.__dict__)

然后一切看起来很好,似乎python module1 已导入像 import module1 ,我可以直接使用 module1 中的类或模块 .

然后提出我的问题---如何检测 __init__.py 中的当前模块对象?我试过 imp.find_module ,但似乎它没有返回模块对象 .

OK , I update the problem here. 首先,module1实际上是我想在代码中使用的,但它依赖于module2和module3,而module1,module2和module3都来自opensource代码 . 为了使其与最新版本保持同步,因此module1,2,3在解压缩后仍然保持原样 . 我们需要包装module1来为其他人提供一些接口,他们希望在调用_1187809时可见module1但是,因为它依赖于module2,3,所以它不可调用 . 所以我想将它包装在一个新的_1187810中,或者只是将"package"重命名为"module1",所以当其他人调用"import package"时,它会透明地使module1名称空间对调用者可见 . 我现在可以使用imp.load_module来加载module1,但是当我调用dir(package)时,它看起来像这样:

>>> import package
>>> print dir(package)
    ['__all__', '__builtins__', '__doc__', '__file__', '__name__', '__package__', 'module1']
>>> print type(package.modue1)
 type<'module'>

因此,调用者仍然无法直接看到module1 . 我注意到,如果我使用这样的棘手方法,我可以更新模块的属性和成员函数:

>>> import package (this will triger calling __init__.py)
>>> package.__dict__.update(package.module1.__dict__)

在此之后,如果我刚刚调用"import module1",一切看起来都像 . 但是,在"import"返回后我无法获取模块对象,我想知道是否有任何方法可以在 init .py中上传模块dict?

1 回答

  • 1

    你为什么要这样做?明确比隐含更好!

    __init__ 中导入API要公开的所有内容,然后让人们使用 from package import * . 使用 __all__ 明确列出应该以这种方式导出的内容 .

    __init__.py 中,使用:

    import module1
    import module2
    
    __all__ = ['module1', 'module2']
    

    并将所有内容导入您的用户 . They should have the choice ,没有强加给他们的模块 .

    或者,如果您认为嵌套模块中的项目在 package 中可见,请明确导入它们,或者也使用 from modulename import * (但是要为这些模块添加 __all__ 列表):

    from module1 import *
    from module1 import __all__ as module1_exported
    from module2 import *
    from module2 import __all__ as module2_exported
    
    __all__ = module1_exported + module2_exported
    

    将项目添加到 __builtins__ 意味着您将名称显示为 everywhere ,而不仅仅是导入 package . 很少需要搞乱内置插件 .

相关问题