4

2つのモジュールを作成しました。

def _func():
    print "hi"

と別の

def func():
    print "hi"

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

4

4 に答える 4

13

はい、機能的に(確かに微妙な)違いがあります。モジュール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
 ...
于 2012-04-06T14:38:04.943 に答える
3

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

Pythonのドキュメントからの詳細情報は次のとおりです:http: //docs.python.org/tutorial/classes.html#tut-private

于 2012-04-06T14:39:29.670 に答える
3

「_」で始まるモジュールレベルの名前には違いがあります。使用する場合、それらはエクスポートされませんfrom module import *-

__all__この動作は、モジュールからエクスポートするすべての属性をリストするという名前のリストをモジュールに持たせることでオーバーライドできます。

けれど:

import module
module._func

違いはありません。他の回答が示すように、「_」は、名前がモジュール/クラス/ APIの私的使用のために予約されている必要があることを示します-ただし、「モジュールのインポートから*」の場合のみ、および認証ヘルプ-としてあなたがあなたの場合にそうするなら、通訳はそれから異なって扱います。

于 2012-04-06T14:41:00.433 に答える
2

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

于 2012-04-06T14:34:56.873 に答える