4
def __f():
  print 1

def _f():
  print 1

インポートを試みましたが、アクセス可能です:

>>> import test1
>>> test1._f()
1

それは何か意味がありますか?クラスベースではないヘルパー関数を書きたいと思っています。次に、特定の低レベルの具体的な関数を非表示にして、ユーザーが使用できる高レベルの関数 (API として表示) のみを残します。

例えば:

test1.copy() は、同じファイル内で追加のチェックを行う別のヘルパー関数を呼び出しますが、それをユーザーに公開したくありません。

4

4 に答える 4

11

先頭の単一のアンダースコアは、Python の命名規則です。多くのツールがその規則に依存しています。たとえば、help()は単一の下線付きの名前を無視します。を使用from somemodule import *すると、単一の下線付きの名前も無視されます。

先頭のアンダースコアが 2 つあると、名前のマングリングがトリガーされます (名前の前にクラス名と先頭のアンダースコアが 1 つ付けられます)。スレッドローカル参照を作成するために使用されます。これにより、サブクラスによって誤って壊れることのないクラス内呼び出しが可能になります。http://docs.python.org/tutorial/classes.html#private-variablesのチュートリアルに、この良い例があります。

最後に、先頭の 2 つのアンダースコアと末尾の 2 つのアンダースコアの特別なメソッド命名規則があります。これらの名前は、インタプリタが演算子を実装し、多くの標準プロトコル (つまり、イテレータ、コンテキスト マネージャ、ピクルなど) を実装するために使用されます。特別なメソッドに関する優れた記事については、http://www.rafekettler.com/magicmethods.htmlを参照してください。

于 2012-04-23T06:54:52.963 に答える
3

先頭のアンダースコアの規則はまさにそれです -礼儀正しいプログラマーが尊重する規則です。

_function()先頭のアンダースコアは、内部実装の詳細であり、外部で使用すべきではない他のプログラマへのヒントです。彼らが呼び出すのを止めるものは何もありません- しかしそうすることで、彼らは の実装がいつでも変更される可能性が_function()あるというあなたのヒントを無視しています. _function()何かが壊れた場合、両方のピースを保持できます。

Python インタープリターは、いかなる種類の制限も強制しません。

于 2012-04-23T06:08:26.870 に答える
2

私が正しく思い出せば、Pythonで関数をプライベートにするクリーンな方法は実際にはありませんでした。この言語は、このように機能することを意図したものではありません。アンダースコア表記は、開発者の間で一般的なプロトコルであり、おそらくプライベートまたは非表示になっているものを示します。

ただし、プライベート機能をシミュレートする方法があるかもしれません。私の頭に浮かぶ最初のことは、トレースバックモジュールを使用してから、呼び出し元のインスタンスを調べて、期待どおりかどうかを確認することです。これは決して私のプロジェクトで行うことではなく、これに反対することを強くお勧めしますが、それなしでは絶対に生きられないのであれば、それは道のりかもしれません。

于 2012-04-23T06:10:28.677 に答える
2

まあ、それはかなり確立された命名規則であり、何もないわけではありません. from [module] import *また、アンダースコアが前に付いていない関数のみをインポートする にも影響します。

于 2012-04-23T06:07:42.737 に答える