私は2つのモジュール、_func()、機能上のアンダースコアの使用? (パイソン)
def _func():
print "hi"
と別の
def func():
print "hi"
私は最初の関数を含むモジュールのヘルプ機能を使用すると、ヘルプモジュールがこれを表示しないと1を作成しました関数。この関数がヘルプ出力に表示される2番目の例とは対照的です。ヘルプ機能の使用とは別の機能上の違いはありますか?
私は2つのモジュール、_func()、機能上のアンダースコアの使用? (パイソン)
def _func():
print "hi"
と別の
def func():
print "hi"
私は最初の関数を含むモジュールのヘルプ機能を使用すると、ヘルプモジュールがこれを表示しないと1を作成しました関数。この関数がヘルプ出力に表示される2番目の例とは対照的です。ヘルプ機能の使用とは別の機能上の違いはありますか?
はい、はです(確かに微妙な)違いは機能的です。あなたが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
...
うわー。それを知らなかった。 +1 – marue
アンダースコアは、通常、モジュールまたはクラスのプライベートメンバーを示すために使用される規則です。
これは、名前がアンダースコアで始まる名前はパブリックAPIの一部と見なされないというPythonの規則ですアンダースコアで始まる関数を含むモジュールまたはクラスのユーザーは、通常のアクセスによってこれらの関数の存在については通知されません。もちろん、それは慣習であるため、バイパスすることはできますが、一般的な経験則として、アンダースコアで始まるものはモジュール/クラス外のコードから隠すことができます。ここで
はPythonドキュメントからのいくつかのより多くの情報です: http://docs.python.org/tutorial/classes.html#tut-privateは、「_」ので見つめモジュールレベル名の違いがあります: あなたがfrom module import *
使用しないときにはエクスポートされません -
この現象は、モジュールに、モジュールからエクスポートするすべての属性を一覧表示する__all__
という名前のリストを持つことでオーバーライドできます。
けれども:
import module
module._func
なしの違いで動作します。他の答えが示唆するように、 "_"は、モジュール/クラス/ APIの私的使用のために名前shouildが予約されているというインジケータです - しかし、 "from module import *"とauthomatic help - asあなたのケースでは、通訳は別の扱いをします。
[Pythonでオブジェクト名の前にある一重引用符と二重アンダースコアの意味](http://stackoverflow.com/questions/1301346/the-meaning-of-a-single-and- Pythonのオブジェクト名の前に二重アンダースコア) – geoffspear
実行できるコードを記述してください:関数を定義するために 'def'を追加してください。 – rubik
重複していません。もう1つの答えは答えのスーパーセットでもあります。 – jsbueno