python: получать субдикты в динамически?

Скажем, я хочу написать функцию, которая будет возвращать произвольное значение из dict, например: mydict['foo']['bar']['baz']или вернуть пустую строку, если это не так. Тем не менее, я не знаю, если mydict['foo'] обязательно будет существовать, не говоря уже о mydict['foo']['bar']['baz'],

Я хотел бы сделать что-то вроде:

safe_nested(dict, element):
  try:
    return dict[element]
  except KeyError:
    return ''

Но я не знаю, как подходить к написанию кода, который будет принимать путь поиска в функции. Я начал идти по пути принятия строки, разделенной точкой (например, foo.bar.baz), так что эта функция может рекурсивно пытаться получить следующий поддикт, но это не выглядит как Pythonic. Мне интересно, есть ли способ пройти как вmydict) и подструктура меня интересует (['foo']['bar']['baz']), и функция пытается получить к нему доступ или вернуть пустую строку, если она встречает KeyError,

Я иду об этом в правильном направлении?

2 ответа

Вы должны использовать стандарт defaultdict: https://docs.python.org/2/library/collections.html

Чтобы узнать, как их вложить, смотрите: defaultdict из defaultdict, вложенные или несколько уровней 'collection.defaultdict' в Python

Я думаю, что это делает то, что вы хотите:

from collections import defaultdict
mydict = defaultdict(lambda: defaultdict(lambda: defaultdict(str)))

Вы также можете проверить наркоман.

>>> from addict import Dict
>>> addicted = Dict()
>>> addicted.a = 2
>>> addicted.b.c.d.e
{}
>>> addicted
{'a': 2, 'b': {'c': {'d': {'e': {}}}}}

Он возвращает пустой Dict, а не пустую строку, но кроме этого он выглядит так, как будто выполняет то, о чем вы просили в вопросе.

Другие вопросы по тегам