假设我有一个包含两个子模块和大量代码的 __init__.py
的包:
pkg/__init__.py
pkg/foo.py
pkg/bar.py
为了让未来计划的重构更容易,我希望包的组件专门使用相对导入方式进行引用。特别地,import pkg
不应出现。
从foo.py
中,我可以这样做:
from __future__ import absolute_import
from . import bar
为了访问bar.py
模块,反之亦然。
问题是,我应该写什么才能以这种方式导入__init__.py
?我想要与import pkg as local_name
完全相同的效果,只是不必指定绝对名称pkg
。
#import pkg as local_name
from . import ??? as local_name
更新: 受maxymoo回答启发,我试了一下。from . import __init__ as local_name
这并不会将local_name
设置为由__init__.py
定义的模块;相反,它获取的是该模块的__init__
方法的绑定方法包装器。我想我可以这样做
from . import __init__ as local_name
local_name = local_name.__self__
为了得到我想要的东西,但(a)让人反感,和(b)这让我担心模块没有完全初始化。
答案需要在Python 2.7和Python 3.4+上都能运行。
是的,清空__init__.py
并只从子模块重复导出东西可能更好,但现在还不行。
__init__.py
中导入特定的函数,我想要整个模块。 - zwol__init__
模块会重新执行该模块,从而产生两个_不同的_模块(pkg is pkg.__init__
为 False)。每个模块都有自己的命名空间。如果您在pkg
中更改了某些内容(例如pkg.config.setSomeValue(...)
),它不会影响到pkg.__init__
中的对应项。 - matafrom .__init__ import *
吗? - maxymoo