IT・技術研修ならCTC教育サービス

サイト内検索 企業情報 サイトマップ

研修コース検索

コラム

ゼロから歩くPythonの道

CTC 教育サービス

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes 

第59回 Pythonを使う時の変数名には、命名規則がある ~変数名の長さ編~ (菱沼佑香) 2025年1月

こんにちは、吉政創成 菱沼です。
今回も「きれいなPythonプログラミング(マイナビ出版)」という書籍を利用して学習します。

前回から4章「わかりやすいネーミング」に入りました。この章では、変数の適切な名前の付け方を学ぶことになりますが、前回は命名規則3種類と、PEP8 、定数について学びました。
今回は具体的にどういった名前の付け方がいいのかを学びます。

変数名はとにかく誰が読んでもわかりやすいものに

いろいろなサンプルコードを見ていると、変数名が数文字程度の短いものもあれば、やたら長い名前がついているものもあったりします。実際のところ、適切な長さはどれくらいなら良いものなのでしょうか。個人的には長いと忘れて毎度調べないと書けなくなるので短い方が好みですが、短すぎてなんだっけ?と思うことも実はあります。ということで、まずは名前の長さについてです。

---------------------------------------------------------------
P.65、66
4.3.1 短すぎる名前
名前が短いと、最初に書いたときには意味があっても、数日後、数週間後には正確な意味が分からなくなってしまうことが多いのです。では、短い名前の種類をいくつか考えてみましょう。

  • gのような名前は、おそらくgで始まる単語を指していると思われるが、そのような単語はたくさんある。1~2文字の名前は、書く側にとってはよいかもしれないが他人が読むのは難しい。
  • 同様に、monのような略語はmonitor、month、monsterなどの単語を表していると思われるが、他人にはわからない。
  • startのような1単語の名前は「何の始まりなのか」曖昧である。このような名前は、他人が読んだときに文脈が分からない可能性がある。

(中略)
例外的に、短い変数名でも問題ない場合があります。例えば、ある変数区間やリストのインデックスに対してループするforループでは、変数名にi(インデックスの意味)を使い、ループを入れ子にしている場合はjとk(アルファベットでiの次に来る)を使うのが一般的です。
(中略)
また、直交座標にxとyを使う場合も例外です。
---------------------------------------------------------------

確かに読む人が自分だけではないケースでは名づけにはより注意が必要ですね。
あと、for文でよく「i」が使われているのは気づいていましたが、なんで「i」なんだろうと思っていました。indexから来ているのと、そういったルールがあったんですね。「i」とかわかりにくいとか思わないようにします。

---------------------------------------------------------------
P.67
4.3.2 長すぎる名前
一般的には、名前のスコープが大きければ大きいほど、より説明的な名前にすべきです。
(中略)
名前に言葉を付け加えることで、文脈がはっきりして曖昧さが解消されます。
説明が足りないよりは、説明が多すぎる方がよいですが、長い名前が不要な場合の判断基準はあります。
---------------------------------------------------------------

ここで例として挙げられているのはpaymentでした。
短いプログラムであればpaymentのような1単語で十分かもしれませんが、プログラムの規模が大きくなるほど、他にpaymentとつけたい変数が増える可能性は確かにあります。なので、そういった場合にも対応できるよう、salesClientMonthlyPaymentや、annual_electricbill_paymentのように、そのpaymentが何用に用意指されているものなのかを名前に反映させることで、誰にとってもわかりやすい変数名とすることができるということです。この時、先ほどの短い名前に書かれていたように使う単語を短くしない(例えば「sales」を「sf」とか)方が良いんだろうなと思います。

---------------------------------------------------------------
P.67
4.3.2 長すぎる名前 名前の中の接頭辞
名前に一般的な接頭辞が使われていると、不必要な情報を含んでしまう可能性があります。変数がクラスの属性である場合、接頭辞は変数名に必要のない情報かもしれません。例えば、Catクラスにweight(体重)と遺族性がある場合、weightが猫の体重を指していることは明らかです。ですので、catWeightという名前にしてしまうと説明的になりすぎ、不必要に長くなってしまいます。
---------------------------------------------------------------

また、どこの情報であるのか、というのが一目見て明確なのであれば、親切心を発揮する必要はないようです。これ以外のポイントとして以下の項目が挙げられていました。

  • 真偽値を返す関数・メソッドには「is_」「has_」をつけるのが一般的
  • ハンガリアン記法は使用しない(strやintなど、変数のデータ型を示す情報などを頭に着ける記法。つける文字は決まっていて、覚える必要がある模様。参考1参考2参考3
  • 変数名に連続した数字をつけるより、別の情報をつける(例えば、優先順位や重要度を数字で表していたのなら、Low、Highなどにする)
検索しやすいのも大事

プログラムの中で、あれどこにいたかなーと思ったとき、検索する人は多いと思います。
そんな検索するときのことを想定すると、例えばaとかbとかだと、候補が多すぎて探しにくいですし、思い出しにくい名前だと探しにくいので、具体的な内容を含めるなど、わかりやすい名前を付けてあげた方が良いですよね。
ちなみに、IDEの機能として、以下のようなことができるんだそうです。

---------------------------------------------------------------
P.68
4.4 検索しやすい名前
IDEの中には、プログラム内で使われている名前を可視化して名前を識別するリファクタリング機能を備えているものがあります。例えば、numという名前の変数と、numberという名前の変数、ローカルなnumとグローバルなnumという変数を区別することができる「リネーム」ツールがよく使われます。しかし、これらのツールがなかったとしても名前を決めることは必要です。
このルールを覚えておけば、一般的な名前ではなく、説明的な名前を付けることが自然とできるようになります。emailという名前では漠然としているので、emailAddresss、downloadEmailAttachment、emailMesssage、replyToAddressssなど、より説明的な名前を考えてみましょう。このような名前は、より正確であるだけでなく、ソースコードファイルの中でも見つけやすくなります。
---------------------------------------------------------------

まずリファクタリングとは何か。Wikipediaには次の通りに書かれていました。

プログラムの外部から見た動作を変えずにソースコードの内部構造を整理することである。また、いくつかのリファクタリング手法の総称としても使われる。ただし、十分に確立された技術とはいえず、また「リファクタリング」という言葉に厳密な定義があるわけではない。

作ったプログラムの挙動を変えることなく、コードをきれいに(わかりやすく)して下さる...もののようです。
そして、リネームと言う機能。例えば以前、数字あてゲームを作ったときのサンプルコードを開き、一部の変数名のリネームを使って変更してみます。
私はVS Codeを利用しています。「Rename Symbol」と言う機能で、F2で実行されるようです。
「tmsg」という変数名のところでF2キーを押してみると、四角の赤枠で囲ったメッセージが表示されます。

fig01

ここに、変更後の名前を入力します。

fig02

そして実行すると...

fig03

お分かりいただけますでしょうか。
変更した箇所の下にある「tmsg」も同時に変換されました。変更漏れが減りそうです。素敵。
とりあえずつけておいた名前を後から変更するのは、IDEを使えば楽に行えそうです。

というわけで、変数名の適切な長さは、短すぎず、長すぎず、とにかく誰が読んでもその用途がわかりやすいような名前を付けることが重要ということのようです。

それではきりが良いので、今回はこちらで終了です。お付き合いいただきありがとうございました。

 


 

 [IT研修]注目キーワード   Python  UiPath(RPA)  最新技術動向  Microsoft Azure  Docker  Kubernetes