1

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

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

4

1 回答 1

2

我假设你的包布局是

my_package/
    __init__.py
        from .foo import myfunc
    foo.py
        def myfunc(): pass

该语句from .foo import myfunc首先导入模块foo,通常不将任何名称引入本地范围。在这第一步之后,myfunc被导入到本地命名空间。

然而,在这种特殊情况下,第一步还将模块导入本地命名空间:包的子模块在导入时被放入包的命名空间,无论它们是从哪里导入的。由于__init__.py也在包的命名空间中执行,这恰好与本地命名空间一致。

您不能合理地禁用此行为。如果您不想foo在包的命名空间中使用该名称,我的建议是重命名模块以_foo将其标记为内部。

于 2012-07-20T14:57:15.197 回答