【发布时间】:2026-01-27 15:45:02
【问题描述】:
我有一个嵌套的字典对象,我希望能够检索任意深度的键值。我可以通过子类化dict 来做到这一点:
>>> class MyDict(dict):
... def recursive_get(self, *args, **kwargs):
... default = kwargs.get('default')
... cursor = self
... for a in args:
... if cursor is default: break
... cursor = cursor.get(a, default)
... return cursor
...
>>> d = MyDict(foo={'bar': 'baz'})
>>> d
{'foo': {'bar': 'baz'}}
>>> d.get('foo')
{'bar': 'baz'}
>>> d.recursive_get('foo')
{'bar': 'baz'}
>>> d.recursive_get('foo', 'bar')
'baz'
>>> d.recursive_get('bogus key', default='nonexistent key')
'nonexistent key'
但是,我不想继承 dict 来获得这种行为。是否有一些具有等效或相似行为的内置方法?如果没有,是否有任何标准或外部模块提供这种行为?
我目前使用的是 Python 2.7,不过我也很想知道 3.x 的解决方案。
【问题讨论】:
-
d.get('foo').get('bar') ?
-
听起来您对使用问题中发布的代码实现的功能相当满意。你有什么特别的原因不想继承
dict吗? -
@Foon,它不会嵌套到任意深度,如果链中早期的某个键不存在,它将引发异常(而不是返回默认值)。
-
@JohnY - 只是几个原因 - 我希望有一些方法可以在 dict 对象上执行此操作而不将它们强制转换为 MyDict 对象,我很好奇如果没有子类化 dict 这是否可能。否则,子类化就可以了。
标签: python dictionary recursion nested