Pythonで識別子(変数名など)として有効・無効な名前、命名規則
Pythonにおいて、識別子(変数、関数、クラスなどの名前)はルールに従って決める必要がある。ルールに沿わない名前は識別子として使えずエラーとなる。
以下はPython3における説明。Python2では異なる場合がある。
識別子(名前)で使える文字・使えない文字
識別子(名前)として使える文字・使えない文字を示す。なお、いろいろと書いているが、基本的には以下の2点を覚えておけばよい。
- 大文字小文字のアルファベットと数字、アンダースコアが使える
- 先頭(一文字目)に数字は使えない
漢字なども使えるが、あえて使う必要はない。
ASCII文字
識別子(名前)として使えるASCII文字は大文字小文字のアルファベット( A
-Z
, a
-z
)と数字(0
-9
)、アンダースコア(_
)。アルファベットの大文字と小文字は区別される。
AbcDef_123 = 100
print(AbcDef_123)
# 100
アンダースコア以外の記号は使えない。
# AbcDef-123 = 100
# SyntaxError: can't assign to operator
また、数字は先頭(一文字目)では使えない。
# 1_abc = 100
# SyntaxError: invalid token
アンダースコアは先頭でも使用可能。
_abc = 100
print(_abc)
# 100
ただし、先頭にアンダースコアをつけると特殊な意味を持つ場合があるので注意。
Unicode文字
Python3からはUnicode文字も使えるようになった。漢字やひらがな、全角英数などが使用可能。
変数その1 = 100
print(変数その1)
# 100
すべてのUnicode文字が使えるわけではなく、Unicodeのカテゴリによっては使えないものもある。例えば句読点などの記号や絵文字などは使えない。
# 変数。 = 100
# SyntaxError: invalid character in identifier
# ☺ = 100
# SyntaxError: invalid character in identifier
使用できるUnicodeのカテゴリコードについては公式ドキュメントを参照。
なお、Unicode文字も使える(エラーにならない)というだけで、多くの場合、あえて漢字などを使うメリットはない。
正規化
Unicode文字は正規化形式NFKCに変換されて解釈される。例えば半角のカタカナが全角のカタカナに変換されたり、全角のアルファベットが半角のアルファベット(ASCII文字)に変換されたりする。
ソースコード上は異なる表示になっていても同じオブジェクトとしてみなされて上書きされてしまったりするので注意。
ヘンスウABC = 100
ヘンスウABC = -100
print(ヘンスウABC)
# -100
print(ヘンスウABC)
# -100
print(ヘンスウABC is ヘンスウABC)
# True
文字列が識別子として有効か確認: isidentifier()
文字列が識別子として有効かどうかは文字列のisidentifier()
メソッドで確認可能。
識別子として有効であればTrue
、無効であればFalse
を返す。
print('AbcDef_123'.isidentifier())
# True
print('AbcDef-123'.isidentifier())
# False
print('変数その1'.isidentifier())
# True
print('☺'.isidentifier())
# False
識別子(名前)として使えない語(予約語)
識別子(名前)として有効な文字列でも識別子として使えない語(予約語)もある。
予約語は識別子としては有効な文字列なのでisidentifier()
ではTrue
を返すが、識別子として使うとエラーとなる。注意。
print('None'.isidentifier())
# True
# None = 100
# SyntaxError: can't assign to keyword
予約語の一覧を取得したり、文字列が予約語かどうかを確認するには標準ライブラリのkeywordモジュールを使う。
識別子(名前)として使わないほうがいい語
Pythonの組み込み関数などの名前は識別子として使えるので、変数として新たな値を代入したりできてしまう。
例えば、len()
はリストの要素数や文字列の文字数を返す組み込み関数。
print(len)
# <built-in function len>
print(len('abc'))
# 3
この名前len
に新たな値を代入すると、もとの関数は上書きされて使えなくなってしまう。代入時には特にエラーや警告も出力されないので注意が必要。
print(len('abc'))
# 3
len = 100
print(len)
# 100
# print(len('abc'))
# TypeError: 'int' object is not callable
そのほか、list = [0, 1, 2]
のようにしてしまってlist()
が使えなくなるというのもよくあるミス。要注意。
組み込み関数や組み込み定数の一覧の確認などについては以下の記事を参照。
PEP8の命名規則
PEPはPython Enhancement Proposal(Python拡張提案)の略で、Pythonの新機能などを説明するドキュメント。
PEP stands for Python Enhancement Proposal. A PEP is a design document providing information to the Python community, or describing a new feature for Python or its processes or environment.
PEP 1 – PEP Purpose and Guidelines | peps.python.org
PEP8はその8番目で、「Style Guide for Python Code」つまりPythonのスタイルガイドについて書かれている。
命名規則についても触れられている。
- PEP 8 - Naming Conventions – Style Guide for Python Code | peps.python.org
- 命名規約 — pep8-ja 1.0 ドキュメント
詳細は上のリンクを参照されたいが、例えば以下のような書き方が推奨されている。
- モジュール
lowercase_underscore
- 小文字 + アンダースコア
- パッケージ
lowercase
- すべて小文字
- クラス、例外
CapitalizedWords
(CamelCase
)- 単語の頭文字を大文字、アンダースコアなし
- 関数、変数、メソッド
lowercase_underscore
- 小文字 + アンダースコア
- 定数
ALL_CAPS
- 大文字 + アンダースコア
あくまでも推奨なのでこう書かないとエラーになるというわけではないが、特に所属組織の命名規則などがない場合はPEP8に準じておくといいだろう。