これは別のデフォルトの引数の質問です。ポイントはあなたが書くとき
def foo(value=VALUE):
関数内のコードはコンパイルされ、関数オブジェクトになります。現時点です。通話時間ではありません。--デフォルトの引数が保存されます。したがって、定義した時点B
では遅すぎます。デフォルト値のfoo
はすでに設定されており、変更しVALUE
ても効果はありません。
これが奇妙なことのように思われる場合foo
は、グローバル関数であると仮定します。
default = 3
def foo(x=default): pass
そうすれば、他のコードは、どこにfoo
いても、
global default
default = 4
これは間違いなく同じように紛らわしいです。
ルックアップをコンパイル時ではなく実行時に強制的に実行するには、ルックアップを関数内に配置する必要があります。
def foo(value=None):
self.value = self.VALUE if value is None else value
または(まったく同じではありませんが、よりきれいです)
self.value = value or self.VALUE
(これは、「偽の」値を番兵として扱うため、異なります。つまり、、0
など[]
は{}
すべて。で上書きされVALUE
ます。)
編集:@mgilsonはこれを行う別の方法を指摘しました:
def foo(**kwargs):
self.value = kwargs.get("value", self.VALUE)
これは、番兵の値(None
またはなど)を作成する必要がないという点で優れていますが、任意のキーワード引数を受け入れるようになったためobject()
、引数の指定が大幅に変更されます。foo