的Python:相对进口进口全包
我只注意到相对进口是这样的:的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
为好,但这种方式,我要重复的名字在几个地方。
我假设你的包布局
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-20 15:16:37
@VladimirMihailenco:请注意,“这种行为”也是Python做的唯一明智的事情。 'import'语句导入'my_package.foo',所以导入后'my_package.foo'应该更好。 – 2012-07-20 15:21:16
是的,我没有借口:)貌似我滥用'__all__'和通配符进口所有的时间。 – 2012-07-20 15:39:39
请提供关于你的软件包布局以及这些语句出现的文件的信息。(我猜这些代码行在'__init __。py'中。) – 2012-07-20 14:51:20
@SvenMarnach,yes,__init__.py。我会更新问题。 – 2012-07-20 14:53:01
这是避免通配符导入的另一个原因。 – jfs 2012-07-20 15:13:13