2012-07-20 86 views
1

我只注意到相对进口是这样的:的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为好,但这种方式,我要重复的名字在几个地方。

+0

请提供关于你的软件包布局以及这些语句出现的文件的信息。(我猜这些代码行在'__init __。py'中。) – 2012-07-20 14:51:20

+0

@SvenMarnach,yes,__init__.py。我会更新问题。 – 2012-07-20 14:53:01

+0

这是避免通配符导入的另一个原因。 – jfs 2012-07-20 15:13:13

回答

2

我假设你的包布局

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

声明from .foo import myfunc第一进口模块foo,一般不会引入任何名称到本地范围。在第一步之后,myfunc被导入到本地命名空间。从他们那里进口包装的子模块在输入放在包的命名空间,无论:

在这种特殊情况下,然而,第一步也导入模块到局部名字空间。由于__init__.py也在包的名称空间中执行,所以这恰好符合本地名称空间。

不能合理地禁止这种行为。如果你不想在你的包的命名空间名称foo,我的建议是将模块重命名为_foo将其标记为内部。

+0

感谢。由于某种原因,我认为这种行为对于相对导入来说是唯一的,但实际上绝对导入的行为方式是一样的。我很幸运,之前我没有碰到过这种行为:) – 2012-07-20 15:16:37

+0

@VladimirMihailenco:请注意,“这种行为”也是Python做的唯一明智的事情。 'import'语句导入'my_package.foo',所以导入后'my_package.foo'应该更好。 – 2012-07-20 15:21:16

+0

是的,我没有借口:)貌似我滥用'__all__'和通配符进口所有的时间。 – 2012-07-20 15:39:39