簡體   English   中英

Python ** kwargs中的KeyError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM