Python:相对导入导入整个包

时间:2012-07-20 14:49:32

标签: python

我刚才注意到这样的相对导入:

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,但这样我必须在多个地方重复名称。

1 个答案:

答案 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以将其标记为内部。