web-dev-qa-db-ja.com

pythonファイル名のアンダースコアプレフィックスは何ですか?

たとえば、cherryPyには、次のようなファイルがあります。

  • __init__.py
  • _cptools.py

それらはどう違いますか?これは何を意味するのでしょうか?

21
DNB5brims

__...__は予約済みを意味しますPythonname(ファイル名と他の名前の両方)。すべきではありません。 invent二重下線表記を使用して独自の名前を作成します。既存の名前を使用する場合は、特別な機能があります。

この特定の例では、__init__.pyはパッケージの「メイン」ユニットを定義します。また、Pythonは、特定のディレクトリをパッケージとして扱います。これは、import cherryPyを呼び出すときに使用される単位です(cherryPyはディレクトリです)。 。これは モジュールチュートリアル で簡単に説明されています。

もう1つの例は、クラスの等価比較を提供する__eq__メソッドです。これらのメソッドを直接呼び出すことができます(たとえば、==演算子を使用する場合は暗黙的に使用します)。ただし、新しいPythonバージョンでは、このようなメソッドがさらに定義される可能性があるため、衝突する可能性があるため、独自の__-名前を作成しないでください。そのような名前の詳細なリストを見つけることができます。 データモデル ドキュメントのメソッド。

_...は「内部」名としてよく使用されます。たとえば、_で始まるモジュールは直接使用しないでください。同様に、_を使用するメソッドは、おそらくプライベートなどです。これは単なる慣例ですが、尊重する必要があります。

24
Michał Górny

これらおよびその他の命名規則については、 スタイルガイドfor Python Code-Descriptive:Naming Styles

簡単に:

  • __double_leading_and_trailing_underscore__:ユーザーが制御する名前空間に存在する「魔法の」オブジェクトまたは属性。例えば。__init____import__または__file__。そのような名前を発明しないでください。文書化されているとおりにのみ使用してください。
  • _single_leading_underscore:弱い「内部使用」インジケーター。例えば。 from M import *は、名前がアンダースコアで始まるオブジェクトをインポートしません。
13
verdesmarald

__init__.pyは、フォルダ内に存在する場合、そのフォルダをモジュールに変える特別なファイルです。モジュールをインポートすると、__init__.py実行されます。もう1つは単なる命名規則ですが、これはそのファイルを直接インポートするべきではないと言うでしょう。

モジュールの作成方法の説明については、ここを見てください: 6.4。パッケージ

一般的なルール:Pythonはnamend__anything__それは特別なことであり、使用する前にそれについて読む必要があります(例:魔法の関数)。

8
javex

現在選択されている回答は、__init__.pyの二重下線表記についてすでに適切な説明を提供しています。

そして、_cptools.py表記ファイル名内は実際には必要ないと思います。おそらく、 スタイルガイドfor Python Code-Descriptive:Naming Styles

  • _single_leading_underscore:弱い「内部使用」インジケーター。例えば。 from M import *は、名前がアンダースコアで始まるオブジェクトをインポートしません。

どちらかといえば、前述のスタイルガイドは実際にはファイル名に_single_leading_underscore.pyを使用してに対してです。その パッケージとモジュール名のセクション は、モジュールがC/C++で実装されている場合のそのような使用法についてのみ言及しています。

一般に、その_single_leading_underscore表記は、他の通常のメソッドと区別するために、通常、関数名、メソッド名、およびメンバー変数で使用されます。

開発者はスクレーパーではないため、ファイル名に_single_leading_underscore.pyを使用する必要はほとんどありません(あるとしても)。開発者はファイル名に基づいてファイルを回収する可能性は低いです。それらはパッケージの最高レベルのAPI(技術的に言えば、__all__で定義された公開エンティティ)に従うだけなので、すべてのファイル名は、ファイル(つまりモジュール)かどうかの要因になることは言うまでもなく、目立たないことさえあります。使用されます。

1
RayLuo