У меня есть вложенный объект словаря, и я хочу иметь возможность извлекать значения ключей с произвольной глубиной. Я могу сделать это с помощью подклассов dict
:Есть ли рекурсивная версия встроенного в dict.get() Python?
>>> 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')? – Foon
Похоже, вы довольны функциональностью, которую вы достигли, используя код, опубликованный в вашем вопросе. Есть ли какая-то конкретная причина, по которой вы не хотите подкласса 'dict'? –
@Foon, который не гнездится на произвольную глубину, и он генерирует исключение (вместо того, чтобы возвращать значение по умолчанию), если какой-либо ключ в начале цепи не существует. – jayhendren