我以這種方式創建了一個包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
爲什麼會發生這種情況?
'從PKG進口*'不得進口,除非'__all__'定義模塊'foo'。如果指定了__all__,我不會遇到同樣的問題。我想知道的是,爲什麼第一次出現'from pkg import *'與文檔一致,即不導入'foo',但第二次出現'from pkg import *'違反了文檔並導入'foo'。 –