2つのモジュールを作成しました。
def _func():
print "hi"
と別の
def func():
print "hi"
最初の機能を含むモジュールでヘルプ機能を使用すると、ヘルプモジュールにこの機能が表示されません。この関数がヘルプ出力に表示される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
...
アンダースコアで始まる名前はパブリックAPIの一部とは見なされないというのは、Pythonの規則です。したがって、アンダースコアで始まる関数を含むモジュールまたはクラスのユーザーは、通常のアクセスではこれらの関数の存在について通知されません。もちろん、これは単なる慣例であるため、バイパスすることもできますが、一般的な経験則として、アンダースコアで始まるものはすべて、モジュール/クラスの外部のコードから隠されていると見なすことができます。
Pythonのドキュメントからの詳細情報は次のとおりです:http: //docs.python.org/tutorial/classes.html#tut-private
「_」で始まるモジュールレベルの名前には違いがあります。使用する場合、それらはエクスポートされませんfrom module import *
-
__all__
この動作は、モジュールからエクスポートするすべての属性をリストするという名前のリストをモジュールに持たせることでオーバーライドできます。
けれど:
import module
module._func
違いはありません。他の回答が示すように、「_」は、名前がモジュール/クラス/ APIの私的使用のために予約されている必要があることを示します-ただし、「モジュールのインポートから*」の場合のみ、および認証ヘルプ-としてあなたがあなたの場合にそうするなら、通訳はそれから異なって扱います。
アンダースコアは、モジュールまたはクラスのプライベートメンバーを示すために通常使用される規則です。