旅行好きなソフトエンジニアの備忘録

プログラミングや技術関連のメモを始めました

【Python】 動的なデフォルト引数を指定するときにはNoneとドキュメンテーション文字列を使う

書籍”Effective Python”項目15のメモです。Pythonを始めて半年経ちますが、真面目に言語自体の勉強をしていなかったので空き時間使ってまだ知らなかった事のメモをします。

Pythonはデフォルト引数をモジュールロード時の一回しか評価しないので、動的な値をデフォルト引数にはしないように、という話でした。

from datetime import datetime
import time

# 動的な型をデフォルト引数にしてみる
def bad_example(when=datetime.now()):
    print(when)

# 時刻が表示される
bad_example()
# 一秒待つ
time.sleep(1)
# 上と同じ時刻が表示される
bad_example()

書籍ではこのような時はデフォルト引数にNoneを指定してドキュメンテーション文字列で振る舞いを書いておくことを勧めています。

def good_example(when=None):
    """
    when: datetime of when the function is called.
          Defaults to the present time.
    """

    when = datetime.now() if when is None else when
    print(when)

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

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