2012-04-06 60 views
3

我創建了兩個模塊,一個與_func(),下劃線的任何功能用法? (Python)的

def _func(): 
    print "hi" 

和另一

def func(): 
    print "hi" 

當我使用模塊,其包括所述第一功能上的幫助功能,幫助模塊不顯示這功能。與此函數在幫助輸出中顯示的第二個示例相反。除了使用幫助功能之外,是否有任何功能差異?

+1

可能重複[在Python中的對象名稱之前的單下劃線和雙下劃線的含義](http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and- python) – geoffspear 2012-04-06 14:33:28

+0

請編寫可執行的代碼:添加'def'來定義函數。 – rubik 2012-04-06 14:39:47

+0

不重複。另一個答案甚至可以是這裏答案的一個超集。 – jsbueno 2012-04-06 14:42:19

回答

11

是的,那裏(功能上明顯不同)。讓我們假設你有一個模塊A.py

foo = 1 
_bar = 2 

觀察:

>>> from A import * 
>>> foo 
1 
>>> _bar 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
NameError: name '_bar' is not defined 

默認的行爲,如果你做一個import *是與領先的下劃線成員不進口。

__all__ = ['foo', '_bar'] 

foo = 1 
_bar = 2 

現在:您可以通過指定一個__all__名單覆蓋該行爲

>>> from A import * 
>>> (foo, _bar) 
(1, 2) 

順便說一句,__all__還覆蓋由help()pydoc所示的成員名單:

$ pydoc A | cat 
... 
DATA 
    __all__ = ['foo', '_bar'] 
    _bar = 2 
    foo = 1 
... 
+0

哇。不知道。 +1 – marue 2012-04-06 14:40:48

2

下劃線是一個通常用於指示模塊或類的私有成員的約定。

2

這是一個Python約定,任何以下劃線開頭的名字都不被視爲public api的一部分,th我們的用戶包含以下劃線開頭的功能的模塊或類不會被正常訪問告知這些功能的存在。當然,既然它只是一個約定,它可以被繞過,但作爲一般的經驗法則,您可以考慮任何以下劃線開頭的內容,以隱藏模塊/類以外的代碼。

下面是從Python文檔的一些詳細信息: http://docs.python.org/tutorial/classes.html#tut-private

3

的模塊級名稱以「_」 S凝視着區別:當你使用from module import *他們沒有出口 -

通過讓模塊有一個名爲__all__的列表可以覆蓋此行爲,該列表列出了您要從模塊中導出的所有屬性。

雖然:

import module 
module._func 

將與無差異的工作。正如其他答案所暗示的那樣:「_」是一個指示名稱,它保留給模塊/類/ API的私有用途 - 但是,在「從模塊導入*」和自動幫助的唯一情況中,作爲你認爲你的情況,解釋者的確對待不同。