CUBE SUGAR CONTAINER

技術系のこと書きます。

Python: 使わない変数を "_" (アンダースコア) に代入するイディオム

Python には、使わない変数であることを明確に示すためにアンダースコアに代入するというイディオムがある。 今回は、そのイディオムについてあらためて紹介してみる。

使った環境は次のとおり。

$ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.14.6
BuildVersion:   18G4032
$ python -V     
Python 3.7.7

イディオムを使わない場合

たとえば、以下のサンプルコードでは、関数 f() がタプルを返す。 この関数の返り値のうち、最初の要素は使わない場合を考えてみよう。 イディオムを使わない場合、添字を使って取り出すことになる。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


def f():
    """タプルを返す関数"""
    return ('foo', 'bar')


def main():
    # 関数を呼び出す
    ret = f()
    # 必要な要素を添字で取り出す
    i_want_this_one = ret[1]
    # 取り出した変数を使って何かする
    ...


if __name__ == '__main__':
    main()

イディオムを使う場合

一方で、イディオムを使ったサンプルコードが次のとおり。 タプルを展開しつつ、使わない要素に関してはアンダースコアに代入している。 このイディオムを使うことで、ソースコードを読む相手に「この要素は処理で使わない」ことを明確に示すことができる。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-


def f():
    """タプルを返す関数"""
    return ('foo', 'bar')


def main():
    # 使わない要素はアンダースコアに代入してしまう
    _, i_want_this_one = f()
    # 取り出した変数を使って何かする
    ...


if __name__ == '__main__':
    main()

Python には変数のアクセス制御をするための構文がない。 そのため、慣例的に名前を使ってアクセス範囲を示す文化がある。 アンダースコアは、一般的に外部からアクセスしてほしくないプライベートに相当するオブジェクトの名前の先頭に付与される。 それの応用に近い形で、アンダースコアに使わない変数を代入するイディオムが広まったのだと考えられる。

注意点

ところで、このイディオムは Python の REPL (Read-Eval-Print Loop: 対話的実行環境) では使わない方が良い。 なぜなら、REPL ではアンダースコアが「最後の評価されたオブジェクト」を表す変数になっているため。

実際に動作を確認するために Python の REPL を起動しよう。

$ python

そして、何か適当なオブジェクトを評価させる。 ここでは整数値の 42 という値を使った。

>>> 42
42

それでは、アンダースコアを参照してみよう。 すると、先ほど評価されたオブジェクトが代入されていることがわかる。

>>> _
42

まとめ

  • Python には使わない変数を "_" (アンダースコア) に代入するイディオムがある
  • ソースコードを読む相手に「この要素は使わない」ことを明確に示せる
  • REPL を使うときはアンダースコアが別の用途で使われるため注意が必要になる