繁体   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