這是另一個default arguments的問題。重點是當你編寫的時候
def foo(value=VALUE):
函數內部的代碼被編譯成一個函數對象。這是這個時間 - 不是在通話時! - 存儲默認參數。所以,你的時間已經確定B
爲時已晚:中foo
默認值已經被設置和改變VALUE
不會有任何效果。
如果這似乎是一個奇怪的事情,假設foo
是一個全球性的功能:
default = 3
def foo(x=default): pass
那麼任何其他代碼,任何地方,可以通過做
global default
default = 4
搞砸foo
這無疑是同樣令人困惑。
要強制查找在運行時做了不編譯的時候,你需要把它們內功能:
def foo(value=None):
self.value = self.VALUE if value is None else value
或(不完全一樣,但是更漂亮)
self.value = value or self.VALUE
(這是不同的,因爲它將把任何「falsy」值作爲前哨 - 也就是說,0
,[]
,{}
等將全部由VALUE
覆蓋)
編輯:@mgilson指出,這樣做的另一種方式:
def foo(**kwargs):
self.value = kwargs.get("value", self.VALUE)
這是因爲它不要求整潔你做一個標記值(如None
或object()
,但它確實改變foo
相當根本的參數規格,因爲現在它會接受任意關鍵字參數。你的來電。
與津貼做正確的唯一方法:
可以按如下步驟寫出來。 – 2012-07-20 14:44:29
@JonasWielicki:如果允許None,你可以使用一個哨兵NOT_VALUE = object()。你不需要'** kwargs' – jfs 2012-07-20 14:45:26
@ J.F.Sebastian哦不錯。 – 2012-07-20 14:46:04