你可以定義一個全局命名__all__
,設置名稱列表或元組,來限制進口和一般將列出文檔的工具:
__all__ = ['function1', 'ClassName2']
的__all__
名稱限制什麼from test import *
會導入,並且還被文檔工具用來限制爲給定模塊列出的公共API。
見import
statement文檔:
由模塊定義的確定公共名通過檢查模塊的名爲__all__
變量的命名空間;如果定義了它,它必須是由該模塊定義或導入的名稱的字符串序列。 __all__
中給出的名稱都被認爲是公開的,並且必須存在。如果未定義__all__
,則公用名稱集合將包含模塊名稱空間中的所有名稱,該名稱不以下劃線字符開頭('_'
)。 __all__
應該包含整個公共API。它旨在避免意外導出不屬於API的項目(例如在模塊中導入和使用的庫模塊)。
您檢查的__init__
模塊幾乎肯定會定義__all__
序列。
您還可以再從你的模塊刪除名,只要你的功能並不需要訪問後的全局名稱:
del sys
IPython的自動完成,否則使用所有名不帶啓動下劃線;自動完成忽略__all__
列表,但會忽略像_sys
這樣的名稱。
的numpy.__init__
module本身再次從全局命名空間中刪除名稱(1.8.0之前的版本):
if __NUMPY_SETUP__:
import sys as _sys
_sys.stderr.write('Running from numpy source directory.\n')
del _sys
但這裏sys
綁定爲_sys
和IPython中會忽略即使在未將其刪除該名稱。 numpy
也在該模塊中建立一個__all__
列表。
在numpy
版本1.8.0和更新的版本中,import sys
語句被添加到該文件中,並且IPython將其提供給自動完成,因爲它仍然是全局命名空間的一部分。
既然您正在查看這些軟件包的來源,或許您可以看到他們在做什麼來阻止它們。 – martineau
是的,看着這個,但到目前爲止還沒有想法 – dreamwalker