Pythonのコードを読んでいると、様々な箇所で「_
」(アンダースコア)が使われているのを目にします。特にシングルアンダースコアは、その使われる場所や文脈によって少しずつ意味合いが変わってきます。
「_
って何のために使われているの?」「変数名の最後に _
が付いているのはなぜ?」
このような疑問を持つことは、Python学習の初期段階ではよくあることです。実はこれらのシングルアンダースコアの使われ方には、Pythonコミュニティで共有されている慣習や明確な目的があります。
この記事では、
- Pythonにおけるシングルアンダースコア (
_
) の基本的な使い方 - 変数名の末尾にアンダースコアを付ける (
variable_
) 場合の役割
に焦点を当てて、初心者にも分かりやすく解説します。これらの使い方をマスターすることで、よりPythonicなコードの読み書きができるようになるでしょう。
(このシリーズでは、続けて「保護された/プライベートメンバーのためのアンダースコア (_variable
, __variable
)」と「ダンダーメソッド (__variable__
)」についても解説していきます。)
シングルアンダースコア _ の主な使われ方
シングルアンダースコアが単独で _
として使われる場合、主に以下の3つの役割があります。これらはPythonの言語仕様として強制されるものではなく、主にコーディング上の慣習として理解されています。
1. 一時的な変数、無視する変数として
最も一般的な使われ方の一つが、値を代入する必要はあるものの、その値を後で参照する予定がない「一時的な変数」や「無視する変数」として _
を使う方法です。
これは、コードを読む人に対して「この変数に格納されている値は、この後の処理では使いませんよ」という意図を明確に伝えるのに役立ちます。
forループでの利用例: ループ処理を実行したい回数だけが重要で、ループカウンターの値自体は使わない場合に便利です。
Python
# 5回 "Hello" と表示する (ループ変数 i は使わない)
for _ in range(5):
print("Hello")
この例では、range(5)
によって 0, 1, 2, 3, 4
という数値が生成されますが、これらの数値自体は print("Hello")
の処理に影響しません。そのため、ループ変数として i
や count
のような名前を付ける代わりに _
を使用しています。
タプルのアンパック時の利用例: 複数の値を持つタプルやリストから一部の値だけを取り出したい場合に、不要な値を _
で受けることができます。
Python
# (x座標, y座標, z座標) を表すタプル
point = (10, 20, 5)
# x座標とy座標だけが必要で、z座標は不要な場合
x, y, _ = point
print(f"X座標: {x}, Y座標: {y}")
# この後、_ に入った 5 を使うことはない
このように、アンパック時に _
を使うことで、不要な要素を無視していることが明確になります。
2. 対話型インタプリタでの直前の結果
Pythonの対話型インタプリタ(PythonコンソールやJupyter Notebookのセルなど)では、_
は特別扱いされ、直前に評価された式の結果を保持します。 これは、計算結果を一時的に確認したり、続けて別の計算に使用したりする際に非常に便利です。
Python
>>> 10 + 5
15
>>> _ # 直前の結果である 15 が表示される
15
>>> _ * 3 # 15 * 3 の計算結果
45
注意点: この _
の振る舞いは、対話型インタプリタ環境に特有のものです。通常のPythonスクリプトファイル(.py
ファイル)内では、_
は直前の結果を自動的に保持する変数としては機能しません(その場合は、先に述べた「一時的な変数」としての扱いに近くなります)。
3. 国際化・地域化 (i18n/l10n) ライブラリでの慣習
ソフトウェアを多言語対応させる際(国際化・地域化)、Pythonでは gettext
などのライブラリがよく使われます。これらのライブラリでは、翻訳対象となる文字列を指定するための関数名として、慣習的に _()
が用いられます。
Python
import gettext
# .mo ファイルの場所などを設定する(実際には適切なパス設定が必要)
# gettext.bindtextdomain('my_app_name', '/path/to/locale')
# gettext.textdomain('my_app_name')
# 翻訳関数を _ という名前でエイリアスするのが一般的
_ = gettext.gettext
# _("...") で囲まれた文字列が翻訳対象となる
welcome_message = _("Welcome to our application!")
print(welcome_message)
これはPythonの言語仕様ではなく、gettext
ライブラリや関連ツールにおける長年の慣習です。_
という短い名前を使うことで、コードの可読性を大きく損なわずに翻訳機能を組み込めるというメリットがあります。
末尾のシングルアンダースコア variable_ の使い方
次に、変数名や関数名の末尾にシングルアンダースコアを付けるパターン、例えば list_
や class_
のような使い方について見ていきましょう。
キーワードや組み込み名との衝突を避けるため
Pythonには、if
, for
, while
のような予約語(キーワード)や、list
, dict
, str
, type
のような組み込み関数名・型名が存在します。これらはPythonの文法や基本的な機能として特別な意味を持っているため、そのまま変数名や関数名として使用することはできません(エラーになるか、意図しない挙動を引き起こします)。
しかし、意味のある変数名を付けようとした際に、どうしてもこれらのキーワードや組み込み名と同じ名前を使いたくなることがあります。そのような場合に、名前の末尾にシングルアンダースコアを付けることで、衝突を回避するという慣習があります。
例:class
キーワードとの衝突回避
Python
# "class" という単語を変数名として使いたいが、これはPythonのキーワード
# class = "Fighter" # これは SyntaxError: invalid syntax となる
# 末尾にアンダースコアを付けて回避
class_ = "Fighter"
print(f"キャラクターのクラス: {class_}")
例:組み込み型 list
との衝突回避
Python
# "list" という名前の変数にリストを代入したい
# しかし、そのまま使うと組み込みの list() 関数を上書きしてしまう可能性がある
# list = [1, 2, 3] # これは可能だが、この後 list() で新しいリストを作れなくなる
# print(list(range(5))) # TypeError: 'list' object is not callable のようなエラーに
# 末尾にアンダースコアを付けて回避
my_items_list_ = [10, 20, 30]
print(f"アイテムリスト: {my_items_list_}")
# 組み込みの list() は影響を受けない
new_list = list(range(3))
print(f"新しいリスト: {new_list}")
このように variable_
という命名規則は、Pythonの予約語や広く使われる名前との意図しない衝突を防ぎつつ、変数に分かりやすい名前を付けるための実用的なテクニックです。
まとめ:シングルアンダースコアを理解して使いこなそう
この記事では、Pythonにおけるシングルアンダースコア _
の主な使われ方と、変数名の末尾にアンダースコアを付ける variable_
の意味について解説しました。
_
(単独のシングルアンダースコア)- 一時的な変数・無視する変数: 値を後で使わないことを明示する。
- 対話型インタプリタ: 直前の評価結果を保持する。
- 国際化:
gettext
ライブラリなどで翻訳対象文字列を示す関数の慣習的な名前。
variable_
(末尾のシングルアンダースコア)- 衝突回避: Pythonのキーワードや組み込み名と同じ名前を使いたい場合に、末尾に
_
を付けて区別する。
- 衝突回避: Pythonのキーワードや組み込み名と同じ名前を使いたい場合に、末尾に
これらのアンダースコアの用法は、Pythonコミュニティにおける重要な慣習であり、コードの可読性や保守性を高めるのに役立ちます。特に、他の人が書いたコードを読む際には、これらのアンダースコアがどのような意図で使われているのかを理解できると、コードの構造やロジックが把握しやすくなります。
次は、クラスやモジュール内部で使われることが多い、名前の先頭にアンダースコアが付く _variable
(保護されたメンバー)や __variable
(名前マングリングによるプライベートメンバー)について詳しく見ていきます。
コメント