2013-11-14 178 views
2

我有一個模塊:模塊揭露導入包

test 
    __init__.py 

__init__.py我有一行:

import numpy as np 

我希望在整個包中使用numpy的(模塊和子模塊)我要創建。

問題是,不知何故numpy越來越暴露。如果我運行IPython並做

import test 

將會有一個test.np可訪問。

我看了很多github上的軟件包,他們經常導入很多主要的__init__.py(sys,division等),但是當我在IPython中導入這些軟件包時,沒有任何外部模塊被暴露。

他們的表現有什麼不同?

+0

既然您正在查看這些軟件包的來源,或許您可以看到他們在做什麼來阻止它們。 – martineau

+0

是的,看着這個,但到目前爲止還沒有想法 – dreamwalker

回答

2

你可以定義一個全局命名__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將其提供給自動完成,因爲它仍然是全局命名空間的一部分。

+0

使用'__all__'而不寫'np'不會使'test.np'無法訪問。 – martineau

+0

@martineau:不,但*不是問題*。 IPython顯示了自動完成目標,而OP在想,爲什麼有些項目似乎導入了各種庫,但IPython沒有列出它們。 –

+0

我測試了這個,即使我有'__all__' = []我仍然可以在IPython中看到我在'__init __。py'中導入的所有東西。無論導入語句是否爲導入numpy或導入numpy爲np,導入sys等 – dreamwalker

-1

你必須確保你只是以某種方式將它導入本地命名空間。

+0

雖然這可以通過將它導入到每個使用它的模塊函數來完成,但除了繁瑣以外,它也是低效的。 – martineau