Python variable name とKeyword、Built-in Functionについてのまとめ

Pythonのコードを書く時にvariable name(変数名)の付け方は結構悩む事の一つです。意味の無い文字だと後から見てもわかりにくくなるので、簡潔かつ意味が分かる名前を付けたいものです。

しかし、最近リストの変数名を”list = [1,2,3,4]”とした所、listの挙動がおかしくなってしまった事があり、色々こんがらがってきたので、改めて変数名の付け方をまとめてみました。

Pythonで変数名を付ける際の基本的ルール

Pythonにおいてを付けるにはルールがあります。
基本的には以下の5つを気を付けたい。

  1. 変数名とは、最初の一文字に”_”(アンダースコア)、文字(数字では無い)を使い、二文字目からは文字、数字、アンダースコアを続けた一続きの文字列。
  2. 変数名では大文字のAと小文字のaは違う文字と判断される
  3. 変数名にKeyword (Reserved word)は使えない
  4. 変数名にはBuilt-in Functionの名前も使わない方が良い
  5. アンダースコアの使い方には注意

以下詳細です。

1. 変数名とは、最初の一文字に”_”(アンダースコア)、文字(数字では無い)を使い、二文字目からは文字、数字、アンダースコアを続けた一続きの文字列。

いきなり長い!ですがもうこれは見たまんまです。

“_test”
“test_2”
“T1231341”

は変数名に出来ますが

“2_test” : 一文字目が数字から始まっている。
“s@$” :記号 @ や $ を使用している。
“test item” :間にスペースがある。

は変数名に出来ません。スペースを入れたい場合にはアンダースコア”_”を使用しましょう。

2. 変数名では大文字のAと小文字のaは違う文字と判断される

これも見たまんま。同じAでも大文字のAと小文字のaは違う物と判断されます。

“test”と”TEST”は別の変数名として認識されます。

3. 変数名にKeyword (Reserved word)は使えない

PythonにはKeyword (Reserved word)があります。

python3.9.1の公式チュートリアルによると、下記の35語とされています。

False      await      else       import     pass
None       break      except     in         raise
True       class      finally    is         return
and        continue   for        lambda     try
as         def        from       nonlocal   while
assert     del        global     not        with
async      elif       if         or         yield

それがKeywordかどうかを調べるには、keyword.iskeyword()を使用すれば確認できます。

>>> import keyword
>>> keyword.iskeyword("is")
True

これらの文字を変数としてデータをassginしようとするとエラーになり、そもそも変数として使えません。

>>> True = "se"
  File "<stdin>", line 1
    True = "se"
    ^
SyntaxError: cannot assign to True

4. 変数名にはBuilt-in Functionの名前も使わない方が良い

さて、当初例に出した”list”はKeywordではありません。
よって変数名には出来るのですが、実際に使ってしまうと困った事になります。
なぜならBuilt-in Functionsの名前だからです。

Python3.9におけるBuilt-in Functionは下記69個になります。

abs()delattr()hash()memoryview()set()
all()dict()help()min()setattr()
any()dir()hex()next()slice()
ascii()divmod()id()object()sorted()
bin()enumerate()input()oct()staticmethod()
bool()eval()int()open()str()
breakpoint()exec()isinstance()ord()sum()
bytearray()filter()issubclass()pow()super()
bytes()float()iter()print()tuple()
callable()format()len()property()type()
chr()frozenset()list()range()vars()
classmethod()getattr()locals()repr()zip()
compile()globals()map()reversed()__import__()
complex()hasattr()max()round()
Built-in Functions python 3.9.1

これらはKeywordではないので変数名に使えるのは確かですが、それをしてしまうとそれぞれに設定された元々の機能は使えなくなってしまいます。

例えば最初の例で行くと”list = [1,2,3,4]”としてしまうとlistはあくまで[1,2,3,4]を入れた変数になってしまい、元々のlistに設定された機能が使えなくなってしまいます。

>>> t = 9, 4
>>> list(t)
[9, 4]
>>> list=(4, 5)
>>> list
(4, 5)
>>> list(t)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'tuple' object is not callable

最初タプルt = (9, 4)をlist(t)でリスト[9, 4]に出来たのですが、listに(4, 5)を代入してしまったので、次はlist自体がタプル(4, 5)になってしまい、listの元の機能が使えなくなった事が分かります。

これを解消するには再度Pythonを立ち上げれば大丈夫。
またlistの元の機能が使える様になります。

こう考えると、注意すべきはBuilt-in Functionsの名前かも知れません。

3でKeywordを変数にしてはいけない、と記載したものの、実はKeywordはそもそも使用出来ませんので。

もしもリストを変数に代入したい場合、名前を”lst”としたり、”list_”とアンダースコアを後に付ける方法があります。

今後注意します。


5. アンダースコアの使い方には注意

アンダースコアは文字と文字を繋げる場合、例えば”list_a”等の様に使う時には問題無いのですが以下の注意点がありますので気を付けましょう。

Double Underscore (= dunder)は使わない方が良い

“__init__” の様に”__”と”__” = Double Underscore (= dunder) で囲まれた名前はシステムで定義された特別な意味を持つので敢えて使わない方が良いと思われます。

一つだけのunderscore “_”も使わない方が良さそう

一つだけのunderscore “_” は対話的にコードを打ち込むターミナル等のInterpreterにおいて、直前の表示 (the last expression) をデータとして持ちます。

>>> "abcd"
'abcd'
>>> _ + "efgh"
'abcdefgh'

>>> “abcd” で表示された ‘abcd’ (直前の表示)が次の >>> _ + “efgh” の”_”に代入されている事が分かります。

下手に変数に使用すると問題がありそうですので、これも敢えて使わない方がよさそうです。

以上、変数名の付け方で気になった所をまとめました。

他に気付く事があればまた追記します。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

16 − 3 =

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください