Python字典get方法默认值的异常行为疑问
为什么Python字典get方法的默认值会提前触发报错?
核心原因很简单:Python在调用函数时,会先把所有参数的表达式都计算完,再把结果传给函数,不管这个参数最后会不会被函数用到。
拿你的代码举例:
- 当你写
data.get("sender", data["from"])时,程序会先执行data["from"]这个表达式,再把它的结果作为默认值传给get方法。如果data里没有"from"键,这一步直接就抛出KeyError了,根本轮不到get方法去判断"sender"是否存在。 - 再看你那行测试代码:
{"sender": "111-111-1111"}.get("sender", {"from": "222-222-2222"}['from']),这里默认值部分的{"from": "222-222-2222"}['from']是能正常算出结果的(临时字典里确实有"from"键),所以求值后得到字符串"222-222-2222",之后get方法发现"sender"存在,就直接返回对应的值,看起来没问题。但如果把默认值里的键改成不存在的,比如{"sender": "111-111-1111"}.get("sender", {"foo": "bar"}['from']),那这个表达式在传参前就会直接抛KeyError,和"sender"存在与否完全没关系。
如果要兼容新旧系统,正确的写法可以用两次get:data.get("sender", data.get("from")),这样即使某个键不存在,只会返回None,不会抛出异常;或者更严谨点,先判断"sender"是否存在,再决定取哪个值:
data["sender"] if "sender" in data else data["from"]
内容的提问来源于stack exchange,提问作者Bigbob556677
相关产品推荐
相关产品推荐

