命名規則におけるアンダースコアの様々な使い方を解説!!!!
Pythonではアンダースコア _
は特殊です。 アンダースコアは多くの言語でただのスネークケースの変数や関数に使われますが、Pythonでは特別な意味を持っています。 ある値を無視したい場合、変数やメソッドの宣言など、様々な場面で広く使われています。
Python の変数名やメソッド名には、シングルとダブルのアンダースコアの意味がある。
この記事では、5つのアンダースコアパターンと命名規則、そしてそれらがPythonプログラムの動作にどのような影響を与えるかを説明します。 これらの概念を理解することは、特に高度なコードを書くときに大いに役立ちます。
この記事の終わりまでに、命名規則でどのように、どこでアンダースコアのパターンを使用するかについて、かなり理解できるようになります。
Single Leading Underscore。 _var
アンダースコアの接頭辞は、単一のアンダースコアで始まる変数またはメソッドが内部使用目的であることを他のプログラマに示すヒントとして意図されています。 この規約は PEP 8.
アンダースコアで始まる名前 (例:
_spam
) は API の非公開部分として扱われるべきです (それが関数、メソッド、データメンバーであろうと)。 これは実装の詳細であり、予告なく変更されることがあると考えるべきです。
次の例を見てみましょう。
class Person:
def __init__(self):
self.name = 'Sarah'
self._age = 26
上記のクラスをインスタンス化して、name
および _age
属性にアクセスしてみましょう。
>>> p = Person()>>> p.name
Sarah>>> p._age
26
つまり、Python における単一のアンダースコア接頭辞は単に合意された慣習であり、その変数の値へのアクセスに何の制限も課しません。
Double Leading Underscore: __var
名前 (特にメソッド名) の前に二重のアンダースコア (__
) を使用することは、慣習ではなく、インタープリタに特定の意味を持ちます。
Python はこれらの名前をマングルし、サブクラスによって定義された名前との衝突を避けるために使用されます。
これは名前のマングリングとも呼ばれます。インタープリタは、後でクラスが拡張されたときに衝突を起こしにくくする方法で変数の名前を変更するのです。
よりよく把握するために、実験のためにおもちゃのクラスを作成します。
class Person:
def __init__(self):
self.name = 'Sarah'
self._age = 26
self.__id = 30
組み込みの dir()
関数を使用して、そのオブジェクトの属性を見てみましょう:
>>> p = Person()
>>> dir(p)
>>> p.name
Sarah
>>> p._age
26>>> p.__id
AttributeError: 'Person' object has no attribute '__id'>>> p._Person__id
30
上のオブジェクト属性のリストから、self.name
と self._age
は変化せず、同じように動作することがわかります。
しかし、__id
は_Person__id
にマングルされている。 これはPythonインタプリタが適用する名前マングリングである。
さて、Person
のサブクラス、例えば Employee
を作成すると、Person
の __id
変数を簡単にオーバーライドすることはできません。
Single Trailing Underscore: var_
As explained in PEP 8 docs:
Single trailing underscore naming convention is used to avoid conflict with Python keywords.
When the most fitting name for a variable is already taken by a keyword, appending a single underscore convention is follow to break the naming conflict.The single Trailing Underscore convention for the variable has been selected by a keyword.
>>> def method(name, class='Classname'): # ❌
SyntaxError: "invalid syntax">>> def method(name, class_='Classname'): # ✅
... pass
Double Leading and Trailing Underscore.典型的な例としては、class
や他のキーワードを変数として使用した場合などがある。 __var__
先頭と末尾にダブルアンダースコア (“dunders”) を持つ名前は、オブジェクトコンストラクタ用の__init__
メソッドや、オブジェクトを呼び出し可能にするための__call__
メソッドなどの特殊用途のために予約されています。 これらのメソッドはダンダーメソッドとして知られています。
人が考える限り、これは単なる慣習で、ユーザー定義の名前と衝突しないような名前を Python システムが使用するための方法なのです。 したがって、ダンダーは単なる慣習であり、Python インタープリターによってそのまま残されます。
class Person:
def __init__(self):
self.__name__ = 'Sarah'>>> Person().__name__
Sarah
ダンダーは、特定のメソッドを特別なものにする一方で、命名規則以外のすべての側面で他のプレーンなメソッドと同じにするという望ましい目的を達成します。 (ダンダーについて包括的に説明しているこの記事を参照してください。)
Single Underscore:
Single Underscore: _
Per convention, single standalone underscore is sometimes used as a name to indicate that a variable is temporary or insignificant.
File: In the following loop we need to the running index and we can use “_
” to indicate that it is just a temporary value:
>>> for _ in range(10):
... print('Welcome Sarah!!')
A again, this meaning is “per convention” only and there is no special behavior trigred in the Python interpreter.This case was a single independent underscore is a name as the extension. 7989>
結論:
様々なアンダースコアのパターンを知ることは、より Python 的なコードを書くのに役立つでしょう。 😄
ここで、上記で取り上げた命名規則に関する5つのアンダースコアパターンを簡単にまとめます。
- Single Leading Underscore
_var
: 名前が内部使用目的であることを示す命名規則。 - Double Leading Underscore
__var
: クラスコンテキストで使用された場合、名前の混乱を誘発する。 Python インタープリタによって強制される。 - Single Trailing Underscore
var_
: - Double Trailing Underscore
__var__
: Python言語が定義する特別なメソッドを示す. - Underscore
_
: 一時的な変数の名前として使用されます。