3 回答

TA貢獻1856條經驗 獲得超5個贊
您可以為默認值傳遞給get()不在字典中的鍵:
self.val2 = kwargs.get('val2',"default value")
但是,如果您計劃使用具有特定默認值的特定參數,為什么不首先使用命名參數?
def __init__(self, val2="default value", **kwargs):

TA貢獻1934條經驗 獲得超2個贊
雖然大多數答案都是這樣說的,例如,
def f(**kwargs):
foo = kwargs.pop('foo')
bar = kwargs.pop('bar')
...etc...
是相同的”
def f(foo=None, bar=None, **kwargs):
...etc...
這不是真的。在后一種情況下,f可以稱為f(23, 42),而前者的情況下接受命名的參數只有 -沒有位置的調用。通常,您希望允許調用者具有最大的靈活性,因此第二種形式(因為大多數答案斷言)更可?。旱闆r并非總是如此。當你接受許多可選參數時,通常只有少數幾個被傳遞,這可能是一個很好的想法(避免在你的呼叫站點發生意外和不可讀的代碼?。﹣韽娭剖褂妹麉?- threading.Thread就是一個例子。第一種形式是如何在Python 2中實現它。
成語是如此重要,以至于在Python 3現在有特殊的支持語法:單后每個參數*的def簽名關鍵字只,也就是說,不能被作為位置參數傳遞,但只是作為一個命名的。所以在Python 3中你可以將上面的代碼編寫為:
def f(*, foo=None, bar=None, **kwargs):
...etc...
實際上,在Python 3中,您甚至可以使用非關鍵字的參數,這些參數不是可選的(沒有默認值的參數)。
但是,Python 2仍然有很長一段時間的生產生活,所以最好不要忘記讓你在Python 2中實現的技巧和習慣用法在Python 3中直接支持的重要設計思想!

TA貢獻1851條經驗 獲得超5個贊
我建議這樣的事情
def testFunc( **kwargs ):
options = {
'option1' : 'default_value1',
'option2' : 'default_value2',
'option3' : 'default_value3', }
options.update(kwargs)
print options
testFunc( option1='new_value1', option3='new_value3' )
# {'option2': 'default_value2', 'option3': 'new_value3', 'option1': 'new_value1'}
testFunc( option2='new_value2' )
# {'option1': 'default_value1', 'option3': 'default_value3', 'option2': 'new_value2'}
然后以您想要的任何方式使用值
dictionaryA.update(dictionaryB)添加內容dictionaryB以dictionaryA覆蓋任何重復的鍵。
添加回答
舉報