[英]KeyError in Python **kwargs
僅第一個打印命令有效。 我不知道為什么。 我想根據傳入的內容顯示不同的前綴和后綴。
# We are going to have a word and a prefix or a suffix before or after
# that word
def joinWords(string, **sFox):
if sFox['prefix']:
return sFox['prefix'] + string
elif sFox['suffix']:
return string + sFox['suffix']
return string
#Why does this work?
#print(joinWords("Cookie", prefix="sugar"))
#And this does not?
#print(joinWords("Cookie", suffix="monster"))
引用sFox
沒有的密鑰將引發錯誤。
另外,即使同時提供了后綴和前綴,當前代碼似乎也只能選擇前綴。
遍歷sFox
的(key, value)
對,您可能想要按以下方式更改代碼。
def joinWords(string, **sFox):
for key, value in sFox.items():
if key == 'prefix':
string = value + string
elif key == 'suffix':
string = string + value
return string
您遇到的問題是, kwargs
將不包含未指定的鍵。 當您嘗試索引字典中不存在的鍵時,它將引發KeyError
,
最直接的解決方案是在嘗試訪問密鑰之前檢查密鑰是否存在:
if 'prefix' in sFox and sFox['prefix']:
還有更好的Pythonic方式可以做到這一點。 如前所述, dict.get()
是默認值的一個不錯的選擇:
if sFox.get('prefix'):
這樣,如果prefix'
不在字典中,則該值將為None
,其值評估為布爾值false,並且可以完美地完成此操作。
當然,如果您真的不需要隨機關鍵字參數,請嘗試使用默認參數:
def joinWords(string, prefix=None, suffix=None):
if prefix:
return prefix + string
elif suffix:
return string + suffix
return string
IMO,除非您嘗試了解關鍵字參數包,否則這可能是一個更好的解決方案。
問題是您使用sFox['prefix']
,當您在調用print(joinWords("Tits", suffix="monster"))
時未傳遞關鍵參數前綴時,它將引發關鍵錯誤。
要修復它,您可以使用sFox.get('prefix')
,當您不通過前綴關鍵字paramter時,它將返回默認值None。
sFox['prefix']
將與鍵返回項prefix
中sFox如果它存在,否則引發一個KeyError
。
更糟的是, if sFox['prefix']:
即使可能仍未執行代碼prefix
不存在中sFox
,因為sFox['prefix']
可以存儲值False
。
我認為您實際上要在此行中執行的操作是測試sFox
包含帶有key prefix
的項目。 在Python中, [key] in [dict]
語法用於此目的。
用它重寫的程序如下所示:
def joinWords(string, **sFox):
if `prefix` in sFox:
return sFox['prefix'] + string
elif `suffix` in sFox:
return string + sFox['suffix']
return string
現在回答另一個問題:自從您return
該部分(即離開該函數)以來,只有該部分才被執行。 如果要兩個部分都執行,則必須在添加后綴和前綴后才返回。 這是一個例子:
def joinWords(string, **sFox):
if `prefix` in sFox:
string = sFox['prefix'] + string
if `suffix` in sFox: # Notice only "if" not "elif"
string = string + sFox['suffix']
return string
最后,向混合添加一些語法糖-看一下python默認參數值 。 通過這些,您可以像下面這樣定義函數:
def joinWords(string, suffix="", postfix=""):
return suffix + string + postfix
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.