2015-12-06 48 views
0

讓我們這個__init__.py在Python3包:爲什麼此導入相關的代碼在__init__.py中工作,但不在不同的.py文件中?

from .mod1 import * 
from .mod2 import * 
from .mod3 import * 
__all__ = mod1.__all__ + mod2.__all__ + mod3.__all__ 

代碼看起來很簡單,做什麼預期:它進口模塊MOD1,MOD2和MOD3這些模塊已經投入了__all__列表中的所有符號和那麼將創建所有三個__all__列表的摘要。

我試着在模塊中運行非常相同的代碼,即不在__init__.py中。它導入了三個模塊,但是mod1,mod2mod3是未定義的變量。

(順便說一句,如果你對原__init__.py運行pylint的,你會得到這樣的錯誤了。)

相同的語句from .mod1 import *__init__.py執行創建mod1對象,但不會在其他地方創建它。爲什麼?

__init__.py是一個特殊的文件,但直到現在,我還以爲只有它的名字是特殊的。

+0

一個側面問題的位,但:你爲什麼這樣做呢? – jonrsharpe

+0

@jonrsharpe我有一個邏輯電路模擬器,具有多個文件中定義的構建塊庫。我希望能夠簡單地添加一個帶有塊的新文件以添加到庫中。我發現了幾個食譜,現在我正在測試它們並學習。 – VPfB

回答

1

按照documentation,這是預期的行爲:

當子模塊使用任何機構被加載(例如importlib API中,importimport-from語句,或者內置__import__())的結合被放置在父模塊的子模塊對象的名稱空間。例如,如果程序包spam具有子模塊foo,則在導入spam.foo後,spam將具有綁定到子模塊的屬性foo

換句話說,當你一個模塊內做from .whatever import something,你會奇蹟般地得到whatever屬性綁定到模塊。當然,您可以在__init__.py內訪問模塊自己的屬性,就好像它們在那裏被定義爲變量一樣。當你在另一個模塊中時,你不能這樣做。在這個意義上__init__.py確實是特別的。

+0

我必須多次閱讀你的答案。希望我終於明白了。如果導入了x和x.y,則Python會將「從x鏈接到y」。只有x是y的父母,不管誰在輸入什麼。 – VPfB

+0

是的,這是重點。 –

相關問題