【发布时间】:2021-05-20 13:10:51
【问题描述】:
为了提供更好的 API 错误,如果 API 请求中缺少特定密钥,我会引发异常 KeyError。
user = {
"id": 1234,
"name": "John Doe"
}
try:
user.pop("id") // for example purpose
user_id = user["id"]
print(user_id)
except KeyError as e:
key_error_message = {
"id": "Key 'id' is missing",
"name": "Key 'name' is missing"
}
print(e) # 'id'
print(type(e)) # <class 'KeyError'>
print(str(e)) # 'id'
print(type(str(e))) # <class 'str'>
print(key_error_message.get(str(e))) # None
print(key_error_message.get(str(e).replace("'", ""))) # Key 'id' is missing
我想知道为什么我在尝试访问 KeyError 的值时必须删除单引号 '?有没有更好的方法来做到这一点?
我知道使用dict 的.get() 方法肯定有更好的方法,但这是我代码中的实际行为,我不想完全重构它。
【问题讨论】:
-
e.args[0]会直接以自然形式为您提供有问题的密钥。KeyError的字符串表示显然是从键的repr()构建的,因此它可能在其他方面有所不同,而不仅仅是在其周围加上单引号(可能有双引号,可能有反斜杠转义序列)。 -
返回引号中的字符串是有充分理由的:如果您有像
1234和'1234'这样的键,那么如果只是打印它们就无法区分它们。使用密钥的repr()可以清楚您拥有什么。 -
谢谢@jasonharper 的解释 :)
-
也谢谢你@ThierryLathuille 我现在明白了!