😎

Pythonのアンダースコア _ の全て:7つの意味と文脈を完全整理

に公開

🐍 Pythonのアンダースコア _ の全7パターン徹底解説

_(アンダースコア)は、Pythonで文脈に応じて7通り以上の意味を持つ超多機能記号
慣習、内部設計、国際化、REPL……
Pythonの哲学がぎっしり詰まっています


🎯 本記事の目的

Pythonにおけるアンダースコアの使い方と意味を、体系的にすべて整理する


📚 _ の使い方【7パターン一覧】

# 書き方 主な用途 概要
_ 🗑️ 無視する変数 for文やアンパックで「使わない」と明示
_var 🔒 内部用変数(慣習) 外部から使わないでね、の合図
var_ 🚧 予約語の回避 class, fromなどと衝突しないため
__var 🥷 名前マングリング クラス外からアクセスしにくくする
__var__ マジックメソッド __init__, __len__などPython構文専用
_ = expr 💭 REPLの直前結果 対話モードで前の出力を再利用できる
_() 🌐 i18n(国際化)関数 翻訳関数 gettext() のエイリアス

🔍 詳細解説


1️⃣ _(無視する変数・捨て変数)

  • 🧠 意味
    この値は使わないから名前なんて不要、という合図。

  • 🛠 使い所

    for _ in range(3):
        print("hello")           # ループ変数を無視
    
    x, _, y = (1, 99, 3)        # 真ん中の値を無視
    
    list(map(lambda _: "ok", range(5)))  # 引数を無視
    
  • 📌 ポイント

    • あくまで「人間への合図」。
    • 実体は普通の変数。上書きすれば通常の値に。

2️⃣ _var(内部実装用変数・慣習)

  • 🧠 意味
    内部的に使う変数・関数です。外部には公開しないでね、のサイン。

  • 🛠 使い所

    class Foo:
        def __init__(self):
            self._cache = {}
    
    foo = Foo()
    print(foo._cache)  # ⚠️ アクセスできるけど、控えてね
    
  • 📌 ポイント

    • Pythonに本当の private はないので、ソフトプライベートとして扱う。
    • ライブラリのドキュメント外APIの目印にもなる。

3️⃣ var_(予約語回避)

  • 🧠 意味
    Pythonの予約語class, from, lambda, …)と名前が被らないように回避。

  • 🛠 使い所

    from_ = "Tokyo"
    class_ = "Car"
    lambda_ = lambda x: x + 1
    
  • 📌 ポイント

    • 末尾に _ を付けるだけで衝突回避
    • 動作に制限はなく、普通の変数として利用可能。

4️⃣ __var(名前マングリング)

  • 🧠 意味
    クラス内だけで使うように“見せる”ための仕組み。
    Pythonが自動で名前を変換(Name Mangling)してくれる。

  • 🛠 使い所

    class A:
        def __init__(self):
            self.__secret = 42
    
    a = A()
    print(a.__secret)     # ❌ AttributeError
    print(a._A__secret)   # ✅ アクセス可能
    
  • 📌 ポイント

    • 完全な private ではないが、誤用を防ぐ防衛線
    • 継承時の名前衝突も避ける。

5️⃣ __var__(マジックメソッド/特殊変数)

  • 🧠 意味
    Python構文や仕組みに深く結びついた特別な名前
    “ダンダーメソッド”とも呼ばれる。

  • 🛠 使い所

    class MyClass:
        def __init__(self, v):        # インスタンス生成時
            self.v = v
    
        def __str__(self):            # print(obj)の出力
            return f"MyClass({self.v})"
    
        def __len__(self):            # len(obj)
            return self.v
    
  • 📌 ポイント

    • Python内部が自動で呼び出す“契約名”。
    • 自作は仕様厳守__mycustom__ などは非推奨。

6️⃣ _ = expr(REPLでの直前評価結果)

  • 🧠 意味
    インタラクティブシェル(REPL)で最後に評価された式の結果が自動的に _ に格納される。

  • 🛠 使い所

    >>> 10 + 5
    15
    >>> _ * 2
    30
    >>> print(_)      # 30
    
  • 📌 ポイント

    • REPL限定の機能。スクリプト中では無効。
    • 自分で _ = … と書くと上書きされ、特殊動作を失う。
    • IPython/Jupyterではさらに _i, _ii, _oh などの履歴変数あり。

7️⃣ _()(国際化・翻訳関数エイリアス)

  • 🧠 意味
    国際化(i18n)の翻訳関数 gettext()_() として呼び出す慣習

  • 🛠 使い所

    from gettext import gettext as _
    print(_("Hello, world!"))  # 翻訳された文字列を表示
    
  • 📌 ポイント

    • Django、Flask、GNU gettext などで広く使われる。
    • _() があると“翻訳対象文字列”としてマークされる。

📦 まとめ(全7パターン)

書き方 目的 主な使い所
_ 🗑️ 無視する変数 for _ in … / x, _, y = …
_var 🔒 内部用変数(慣習) self._cache
var_ 🚧 予約語回避 from_ = "Tokyo"
__var 🥷 名前マングリング self.__secret
__var__ ✨ マジックメソッド __init__, __len__, …
_ = expr 💭 REPLでの直前評価結果 >>> 3*7 → 21>>> _ + 1 → 22
_() 🌐 翻訳関数エイリアス(i18n) _("Welcome")

💡 補足

Pythonのアンダースコアは、単なる記号を超えた、“設計者とコミュニティの暗黙の対話”

Explicit is better than Implicit — 明示は暗黙に勝る

この思想が、アンダースコアの多彩な使い方に息づいています。

Discussion