2012-04-06 15 views
3

私は2つのモジュール、_func()、機能上のアンダースコアの使用? (パイソン)

def _func(): 
    print "hi" 

と別の

def func(): 
    print "hi" 

私は最初の関数を含むモジュールのヘルプ機能を使用すると、ヘルプモジュールがこれを表示しないと1を作成しました関数。この関数がヘルプ出力に表示される2番目の例とは対照的です。ヘルプ機能の使用とは別の機能上の違いはありますか?

+1

[Pythonでオブジェクト名の前にある一重引用符と二重アンダースコアの意味](http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and- Pythonのオブジェクト名の前に二重アンダースコア) – geoffspear

+0

実行できるコードを記述してください:関数を定義するために 'def'を追加してください。 – rubik

+0

重複していません。もう1つの答えは答えのスーパーセットでもあります。 – jsbueno

答えて

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__リストを指定することで、その動作をオーバーライドすることができます

__all__ = ['foo', '_bar'] 

foo = 1 
_bar = 2 

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

ところで、__all__help()またはpydocによって示されるメンバーのリストを上書きします:

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

うわー。それを知らなかった。 +1 – marue

2

アンダースコアは、通常、モジュールまたはクラスのプライベートメンバーを示すために使用される規則です。

2

これは、名前がアンダースコアで始まる名前はパブリックAPIの一部と見なされないというPythonの規則ですアンダースコアで始まる関数を含むモジュールまたはクラスのユーザーは、通常のアクセスによってこれらの関数の存在については通知されません。もちろん、それは慣習であるため、バイパスすることはできますが、一般的な経験則として、アンダースコアで始まるものはモジュール/クラス外のコードから隠すことができます。ここで

はPythonドキュメントからのいくつかのより多くの情報です: http://docs.python.org/tutorial/classes.html#tut-private

3

は、「_」ので見つめモジュールレベル名の違いがあります: あなたがfrom module import *使用しないときにはエクスポートされません -

この現象は、モジュールに、モジュールからエクスポートするすべての属性を一覧表示する__all__という名前のリストを持つことでオーバーライドできます。

けれども:

import module 
module._func 

なしの違いで動作します。他の答えが示唆するように、 "_"は、モジュール/クラス/ APIの私的使用のために名前shouildが予約されているというインジケータです - しかし、 "from module import *"とauthomatic help - asあなたのケースでは、通訳は別の扱いをします。

関連する問題