2014-12-08 55 views
3

我有我,導入其他模塊(通常爲sysos)的模塊,當我導入模塊Python模塊:如何使私有符號表保密?

import mymodule 

,如果我做這樣的事情

dir(mymodule) 

我得到的不僅是該模塊的子模塊,還包括os等。

['__builtins__', '__doc__', '__file__', '__name__', '__package__', 'os', 'sys', 'submodule'] 

有沒有一種方法,以避免有進口我的模塊內的模塊的符號表顯示模塊?是否可以保持私密?

+0

在列表中隱藏'os'或'sys'模塊的目的是什麼? – Nilesh 2014-12-08 09:49:40

+1

'dir()'是一個**調試工具**。你確定要刪除該工具嗎? – 2014-12-08 09:51:39

+0

另外,如果你在模塊中編碼*使用'os'和'sys',那麼你不能從你的名字空間中刪除它們。他們正在使用,並刪除它們會破壞你的代碼。此外,名稱只是*參考*。 – 2014-12-08 09:52:26

回答

1

確實沒有任何這樣的事情在Python的「私人」;如果你想溝通名稱是私人的,你在名稱上使用前導下劃線。有經驗的Python開發人員會明白,這些名稱不應該在模塊之外使用。

dir()(真的是一個調試工具)向您顯示模塊的全局名稱空間,您不必擔心在該列表中看到導入的模塊;這是完全正常。使用sysossubmodule作爲全局名稱的該模塊中的任何代碼(在函數或生成器表達式中)將解析來自該名稱空間的引用。因此,您需要這些名稱在您的代碼中繼續工作。

您可以在全局名稱空間中創建一個名稱爲__all__的序列,以列出您希望他人從模塊中使用的所有名稱。 dir()將不會使用它,但語法如from mymodule import *help(mymodule)確實遵守該順序。

你也可以給那些你輸入「私人」的名字模塊:

import os as _os 
import sys as _sys 

,並在代碼中使用這些更新的名字更新所有引用。如果您尚未設置__all__,則from mymodule import *help(mymodule)將至少忽略以下劃線開頭的名稱。

而且你可以隨時使用del osdel sys如果你只使用在頂層的模塊,並在代碼中沒有功能需要這些名稱存在,作爲全局。

2

好了,你可以使用del命名空間中刪除模塊:

import os 

# ... all other code here 

del os 

之後,它是不可見的再導入時。

然而,當模塊被用到,這是不行的......

+0

如果我這樣做,那麼它會打破我的模塊;如果它不破壞任何東西,它會更好! – MBR 2014-12-08 10:25:05