2012-07-20 91 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