モブプロな人たちのブログ

横浜で Web サービス開発しているエンジニアの日記です。Python 大好き Flask 大好き。たまに SpriteKit でゲーム開発も。

Python で 可変長位置引数を使って、見た目をすっきりさせる

「Effective Python」を久しぶりに読み返して、当時は特に何も思わなかった箇所に引っかかったのでメモを残しておきますシリーズ第3弾。

Effective Python ―Pythonプログラムを改良する59項目

Effective Python ―Pythonプログラムを改良する59項目

Python で 可変長位置引数を使って、見た目をすっきりさせる

すっきりとはなんぞや? という感じかもしれませんが、具体的にコードを見ると分かりやすいのです。

def log(message, values):
    if not values:
        print(message)
    else:
        values_str = ', '.join(str(x) for x in values)
        print('{0}: {1}'.format(message, values_str))

def log_with_star_args(message, *values):
    if not values:
        print(message)
    else:
        values_str = ', '.join(str(x) for x in values)
        print('{0}: {1}'.format(message, values_str))

if __name__ == '__main__':
    my_numbers = [1, 2]

    # NG
    log('My numbers are', my_numbers)
    log('My numbers are', [3, 4])
    log('Hi there', [])

    # OK
    log_with_star_args('My numbers are', *my_numbers)
    log_with_star_args('My numbers are', 3, 4)
    log_with_star_args('Hi there')

log() を呼んでる方は、第2引数に渡すものがないときに空のリストを渡していますが、log_with_star_args() を呼んでる方は、渡すものがなければ渡さなくて良くなりました。

すっきりしてて良いですね。

なお、可変長位置引数は、仮引数が *args のような記法なので「スター引数(star args)」とも呼ばれます。