2 回答

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
不,*args
并且**kwargs
是接收任何沒有顯式參數(shù)的參數(shù)的全部參數(shù)。指定默認(rèn)值違背了它們的目的。相反,您的示例默認(rèn)值可以使用現(xiàn)有語法處理,無需在此處使函數(shù)定義語法復(fù)雜化。
您可以通過指定普通關(guān)鍵字參數(shù)來覆蓋默認(rèn)值:
def foo(pos0, pos1='v', a=20, *args, **kwargs): pass
我(1, 'v')
用另一個(gè)關(guān)鍵字參數(shù)替換了您的“默認(rèn)”,因?yàn)槟梢允褂?em>位置參數(shù)為關(guān)鍵字參數(shù)提供值;foo(42, 'spam')
將設(shè)置pos1
為'spam'
.
此外,您始終可以在您定義的函數(shù)內(nèi)部進(jìn)行進(jìn)一步處理;該args
值是一個(gè)元組,只需測(cè)試長(zhǎng)度以檢查是否需要對(duì)缺失值使用默認(rèn)值。kwargs
是字典,只需使用kwargs.get(key, default)
或kwargs.pop(key, default)
或if key not in kwargs:
或任何其他dict
方法來處理丟失的鍵。

TA貢獻(xiàn)1815條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可以使用默認(rèn)值kwargs并仍然使用splatla解壓縮**kwargs
def john(name, dog, *args, bob="bob", **kwargs):
print(name, dog, bob)
# "ream" is an unpacked arg
john("john", 1, "ream") # john 1 bob
# jane is an unpacked kwarg
john("john", 1, "ream", jane="jane") # john 1 bob
john("john", 1, "ream", bob="jane") # john 1 jane
為 an 設(shè)置默認(rèn)值*arg非常困難,因?yàn)槠湎敕ㄊ鞘购瘮?shù)需要該輸入。您可以在這種情況下查看一些技巧,例如range內(nèi)置函數(shù)的實(shí)現(xiàn)。我只是讓它成為一個(gè)kwarg雖然。
添加回答
舉報(bào)