【问题标题】:KeyError exception's value is surrounded by single quotesKeyError 异常的值用单引号括起来
【发布时间】: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 我现在明白了!

标签: python keyerror


【解决方案1】:

使用args字段访问导致异常的键名:

try:
    ....
except KeyError as e:
    missing_key = e.args[0]
    print(f"Key '{missing_key}' is missing")

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 1970-01-01
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2013-03-22
    • 1970-01-01
    • 1970-01-01
    • 2016-06-06
    相关资源
    最近更新 更多