2010-02-02 87 views
21

我在Python/Lib源代碼中見過很多,但我不知道它是什麼。什麼是python __all__模塊級變量?

我認爲它被用來限制模塊的可訪問成員。所以只有__all__的元素會在dir(module)時出現。

我做了一個小例子,看到它沒有按預期工作。

那麼...什麼是蟒蛇__all__模塊級變量?

+4

相似的問題這裏:http://stackoverflow.com/questions/44834/can-someone-explain-all-in-python – 2011-07-28 14:41:35

回答

43

它有兩個目的:

  1. 如果誰讀取源將知道暴露了什麼公共API是。它不會阻止他們在私人宣言中扯皮,但確實提供了一個不好的警告。

  2. 使用from mod import *時,只會導入__all__中列出的名稱。在我看來,這並不重要,因爲導入一切都是真的壞主意。當用戶寫 from sound.effects import *

+7

不只是任何人,任何事情。一些api文檔工具尊重'__all__'。 pydoc的確如此,而且我很確定epydoc之類的。 – mzz 2010-02-03 00:59:00

+0

a中的公共變量。當我們執行'import *'時,即使它們沒有包含在__all __中,py'也可以在另一個文件中使用。請問任何人都可以澄清一下這個..? – Alchemist777 2013-02-08 04:44:29

+0

獅身人面像也尊重'__all__'' – Rafe 2013-04-20 18:31:49

7

http://docs.python.org/tutorial/modules.html#importing-from-a-package

現在會發生什麼?理想情況下, 人會希望這不知何故 出到文件系統,發現哪些 子模塊出現在包中, 並將它們全部導入。這可能需要很長時間 ,並且導入子模塊 可能會產生不必要的副作用, 應該只在明確導入子模塊 時發生。

唯一的解決辦法是爲作者提供 包的明確索引 包。 import語句 以下約定:如果一個 封裝的__init__.py代碼定義了一個名爲__all__一個 列表,它被認爲是 當遇到from package import * 應該 導入模塊名稱的列表。 軟件包的作者在發佈 軟件包的新版本時,要保持此列表 爲最新版本。軟件包作者 也可能決定不支持它,如果 他們沒有看到用於從其軟件包中導入* 的用法。