我刚才注意到这样的相对导入:
from .foo import myfunc
print myfunc # ok
print foo # ok
导入foo和myfunc。这种行为是否记录在何处?我可以禁用吗?
- 更新
基本上是问题。
bar/foo/__init__.py
:
__all__ = ['myfunc']
def myfunc(): pass
bar/__init__.py
:
from .foo import *
# here I expect that there is only myfunc defined
main.py
:
import foo
from bar import * # this import shadows original foo
我也可以将__all__
添加到bar/__init__.py
,但这样我必须在多个地方重复名称。
答案 0 :(得分:2)
我假设您的包布局是
my_package/
__init__.py
from .foo import myfunc
foo.py
def myfunc(): pass
语句from .foo import myfunc
首先导入模块foo
,通常不会在本地范围中引入任何名称。完成第一步后,myfunc
将导入到本地名称空间。
但是,在这种特殊情况下,第一步还将模块导入本地命名空间:无论从何处导入,包的子模块都会在导入时放入包的命名空间中。由于__init__.py
也在包的命名空间中执行,因此这恰好与本地命名空间一致。
您无法合理地禁用此行为。如果您不想在包的命名空间中使用名称foo
,我的建议是将模块重命名为_foo
以将其标记为内部。