2017-02-22 79 views
0

我以這種方式創建了一個包pkg爲什麼從pkg import *結束導入模塊,即使__all__未定義?

$ tree 
. 
└── pkg 
    ├── foo.py 
    └── __init__.py 

1 directory, 2 files 
[email protected]:~/so$ cat pkg/__init__.py 
[email protected]:~/so$ cat pkg/foo.py 
print('executing module foo ...') 

def bar(): 
    print('bar') 

所有Python的外殼下面片段是從Python解釋器的單一互動 會議。我已將它們分成多個 區塊,以在兩者之間添加我自己的評論。

這是我的Python版本。

Python 3.4.2 (default, Oct 8 2014, 10:45:20) 
[GCC 4.9.1] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

以下導入不會導入foo因爲__all____init__.py沒有 定義。

>>> from pkg import * 
>>> foo.bar() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'foo' is not defined 
>>> 

上述行爲已經在 https://docs.python.org/3/tutorial/modules.html#importing-from-a-package在Python教程中描述。

如果沒有定義__all__,聲明from sound.effects import * 不會從包sound.effects到 當前命名空間中導入所有的子模塊;它只確保包sound.effects已導入 (可能運行 __init__.py中的任何初始化代碼),然後導入 包中定義的任何名稱。

以下僅導入bar()。它不會導入foo

>>> from pkg.foo import bar 
executing module foo ... 
>>> bar() 
bar 
>>> foo.bar() 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name 'foo' is not defined 

但以前的導入後奇怪的是,下面的導入結束 進口foo即使__all____init__.py沒有定義。

>>> from pkg import * 
>>> foo.bar() 
bar 

爲什麼會發生這種情況?

回答

0

根據您引用的Python文檔,當您使用from pkg import *時,您只導入模塊foo以及__init__.py而不是foo的功能。

我懷疑最後的代碼片斷您所提供的作品,因爲你已經從foo進口bar()直接和重新導入foo後你嚴格進口的圓鋼功能建立foobar()之間的連接。

當您指定__all__時,是否遇到同樣的問題?

+0

'從PKG進口*'不得進口,除非'__all__'定義模塊'foo'。如果指定了__all__,我不會遇到同樣的問題。我想知道的是,爲什麼第一次出現'from pkg import *'與文檔一致,即不導入'foo',但第二次出現'from pkg import *'違反了文檔並導入'foo'。 –

0

foo已經導入pkg命名空間爲pkg.foo當你做from pkg.foo import bar。因此,當您將名稱空間中的所有名稱從pkg導入當前作用域時,您還將導入foo。請參閱:

>>> import pkg 
>>> dir(pkg) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__'] 
>>> from pkg.foo import bar 
executing module foo ... 
>>> dir(pkg) 
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'foo'] 

(我是蟒蛇2,但這樣做的邏輯是一樣的)

相關問題