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