Python3嵌套字典:try块取子键是否为不良实践?有无更简洁写法?
关于Python嵌套字典键获取的问题解答
首先明确:示例2的思路本身不是不良实践,但代码里的except:是不良写法——它会捕获所有异常(比如a未定义、a不是字典这类完全无关的错误),应该只捕获KeyError,避免误吞其他问题。
Python社区更推崇**EAFP(请求原谅比请求许可更容易)**的编程风格,也就是先尝试执行操作,再捕获可能的异常,这和Perl常用的LBYL(先检查再执行)思路不同。对于字典键访问这种场景,EAFP不仅更符合Python惯用写法,正常路径下的效率也更高(因为异常仅在出错时触发,无需提前做多层判断)。
更简洁的实现方法
嵌套使用
dict.get()(最常用):
利用get()方法可以指定默认值的特性,逐层获取嵌套键,无需写多层if判断:b = a.get('x', {}).get('y') if b is not None: # 处理b的逻辑如果
a中没有'x',get('x', {})会返回空字典,后续get('y')就会返回None,完美替代示例1的多层检查。改进版try-except(更安全):
把裸except改成捕获具体的KeyError,既保留EAFP的简洁,又不会误吞其他异常:b = None try: b = a['x']['y'] except KeyError: pass if b is not None: # 处理b的逻辑Python 3.8+ 海象运算符简化:
可以把赋值和判断合并成一行,让代码更紧凑:if (b := a.get('x', {}).get('y')) is not None: # 处理b的逻辑处理深层嵌套(functools.reduce):
如果嵌套层级很多,比如要取a['x']['y']['z']['w'],可以用reduce来批量处理键列表:from functools import reduce def get_nested_value(d, keys): return reduce( lambda curr, key: curr.get(key, {}) if isinstance(curr, dict) else None, keys, d ) b = get_nested_value(a, ['x', 'y']) if b is not None: # 处理b的逻辑
内容的提问来源于stack exchange,提问作者Tim Watts
相关产品推荐
相关产品推荐

