2015-11-04 49 views
2

有了這個簡單的模塊:如何從iPython中的命名空間隱藏導入的模塊?

#!/usr/bin/python 
#file: foo.py 
import ctypes 

class Foo(ctypes.Structure): 
    pass 

在IPython中:

In [1]: import foo 
In [2]: foo. 
Foo 
ctypes 

​​是模塊foo內部使用的模塊,它不應該被顯示給用戶。我們的目標是通過ipython

隱藏​​以提供自動完成功能此解決方案是否太麻煩?

import ctypes as __ctypes 
+1

我會說這太麻煩了,是的(最多使用一個下劃線)。 *爲什麼要隱藏模塊名稱空間中的一些名稱?您是否考慮過使用'__all__'(請參閱http://stackoverflow.com/q/44834/3001761),如果這是通配符導入的問題? – jonrsharpe

+0

如果用戶不知道「ctypes」是我的模塊使用的模塊,但不是它的一個功能,用戶可能會感到困惑。我期待用戶使用自動完成來查看他可以使用什麼對象。一種解決方案是在所有可用方法所在的模塊內創建一個靜態類。我認爲這不是一個更好的解決方案 – nowox

+0

爲什麼你認爲任何人會被這個困惑?不需要靜態類,你可以公開一個應該使用的屬性名稱列表(就像'__all__',甚至可以使用這個名稱!),但是隻要你有任何導入,並且很少被證明是一個棘手的問題。 – jonrsharpe

回答

3

我通常使用__all__。您的代碼將成爲類似:

import ctypes 

# Note here 
___all__ = [] 

class Foo(ctypes.Structure): 
    pass 

# Note here 
__all__ += ['Foo'] 

如果你這樣做from foo import *,你會看到只有Foo(或者其他任何你添加到__all__)。

+0

你不需要在最後添加''Foo''',我會說把文件頂部的所有名稱都包含進來是更加簡單的。 – jonrsharpe

+0

我同意它不必在類定義之後去(畢竟它只是一個字符串),但我通常不會將它放在開頭或結尾,而是將它與類/函數/其他分組在一起。這樣,如果我修改了定義,我記得也修改了全部。 –

+0

它不起作用。如果您在iPython上導入此模塊,則自動完成仍會顯示模塊的所有成員,包括'ctypes'。 – nowox