『Effective Python』の続き。デフォルト引数の評価は作成時一度のみ。繰り返しませんのでどうか皆様None
を使ってdocstring
をお書きください。
www.effectivepython.com
前回『Effective Python』Item 19: キーワード引数でオプションを提供しよう - 何かを書き留める何かはデフォルト引数は便利である、という話題であったが、今回はリストや辞書といったミュータブルなデフォルト値に対する注意である。
import datetime def log(message, when=datetime.now()): print('%s: %s' % (when, message)) log('Hi there!') sleep(0.1) log('Hi again!')
というコードを実行すると、datetime.now
が1回しか評価されていないことがわかる。
対策は、デフォルト引数をNone
にして引数が省略されたら内部で新しいオブジェクトを作るようにする、となる。
『Python文法詳解』にもP194の「6.1.3 デフォルト引数」にて同等の内容が簡潔に説明されている。

- 作者: 石本敦夫
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/09/18
- メディア: 大型本
- この商品を含むブログ (2件) を見る
そして、デフォルト引数がNone
だとデフォルトの振る舞いがわからないのでdocstring
で説明しましょう、というのが筆者の主張である。
偶然にも、『Python文法詳解』のP195は「6.1.4 ドキュメンテーション文字列」である。
def log(message, when=None): """タイムスタンプつきのログメッセージを出力する。 Args: message: 出力するメッセージ。 when: メッセージを出力する時間。 デフォルト値は現在の時刻 """ when = datetime.now() if when is None else when print('%s: %s' % (when, message)) log('Hi there!') sleep(0.1) log('Hi again!')