Python中是否有类似JavaScript可选链的简洁嵌套对象遍历方式?
Python中类似JavaScript可选链的简洁嵌套访问方案
JavaScript里的可选链?.可以安全遍历深度嵌套的对象,避免键不存在时的报错,比如:
const foo= { correct: { key: 'nested' } } const correct = foo?.correct?.key const incorrect = foo?.incorrect?.key // 返回undefined,不会报错
你提到用嵌套getattr的Python写法太繁琐,这里提供几种更简洁的实现方式:
一、针对嵌套字典:链式dict.get()
字典可以直接链式调用get(),每次给不存在的键指定默认空字典,就能安全访问深层键:
foo = { "correct": { "key": "nested" } } correct = foo.get("correct", {}).get("key") incorrect = foo.get("incorrect", {}).get("key") # 返回None,无报错
嫌每次写默认值麻烦的话,封装个工具函数更省心:
def safe_get(obj, *keys): for key in keys: obj = obj.get(key, None) if obj is None: break return obj # 调用示例 correct = safe_get(foo, "correct", "key") incorrect = safe_get(foo, "incorrect", "key")
二、针对类实例对象:封装安全属性访问函数
如果是访问类的嵌套属性,嵌套getattr确实笨拙,写个通用函数就能解决:
def safe_getattr(obj, *attrs, default=None): for attr in attrs: obj = getattr(obj, attr, default) if obj == default: break return obj # 调用示例 class Foo: def __init__(self): self.correct = type('Correct', (), {'key': 'nested'})() foo = Foo() correct = safe_getattr(foo, "correct", "key") incorrect = safe_getattr(foo, "incorrect", "key") # 返回None
三、Python 3.10+:用结构模式匹配简化
Python 3.10及以上版本支持结构模式匹配,能直观解构嵌套对象或字典:
处理字典:
foo = {"correct": {"key": "nested"}} # 获取存在的键值 match foo: case {"correct": {"key": value}}: correct = value case _: correct = None # 获取不存在的键值 match foo: case {"incorrect": {"key": value}}: incorrect = value case _: incorrect = None
处理类对象:
class Foo: def __init__(self): self.correct = type('Correct', (), {'key': 'nested'})() foo = Foo() match foo: case Foo(correct=Correct(key=value)): correct = value case _: correct = None
内容的提问来源于stack exchange,提问作者Ucinorn
相关产品推荐
相关产品推荐

