В поисках способа работы с вложенными словарями я нашел следующий код, отправленный nosklo, который я хотел бы объяснить.
class AutoVivification(dict):
"""Implementation of perl autovivification feature."""
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
Тестирование:
a = AutoVivification()
a[1][2][3] = 4
a[1][3][3] = 5
a[1][2]['test'] = 6
print a
Вывод:
{1: {2: {'test': 6, 3: 4}, 3: {3: 5}}}
Я довольно программист для новичков. Я узнал большую часть того, что знаю в свое время на стороне, с моим единственным формальным обучением, которое было на Turbo Pascal в средней школе. Я понимаю и умею использовать классы простыми способами, например, используя __init__, методы класса и хранение данных в экземплярах класса с foo.man = 'choo'.
Я не знаю, как серия квадратных скобок будет правильно направлена через класс (я полагаю, что они как-то называют __getitem__), и не понимают, как каждый из них обрабатывается так лаконично, без вызова метода три раза индивидуально.
У меня создалось впечатление, что (dict) в объявлении класса будет обрабатываться __init__.
Я использовал try: except: раньше, хотя и снова, довольно простыми способами. Мне кажется, что try, когда он запускается, вызывает серию функций __getitem__. Я понимаю, что если словарь текущего уровня существует, попытка будет проходить и перейти к следующему словарю. Полагаю, что except запускается, когда есть KeyError, но я раньше не видел self. self обрабатывается как словарь, тогда как я думал, что self был экземпляром class AutoVivification... это он? Я никогда не назначал два раза подряд, как этот foo = man = choo, но подозреваю, что value указывает на self[item], а self[item] указывает на результат type(self). Но type(self) вернет что-то вроде этого: <class '__main__.AutoVivification'> не так ли? Я понятия не имею, какие дополнительные круглые скобки в конце есть. Поскольку я не знаю, как вызывается функция, я не понимаю, куда возвращается value.
Извините за все вопросы! В этом так много всего, что я не понимаю, и я не знаю, где искать его, не прочитав документацию в течение нескольких часов, в которой я бы сохранил очень мало. Этот код выглядит так, как будто он будет служить моим целям, но я хочу его понять, прежде чем использовать его.
Если вы хотите знать, что я пытаюсь сделать в своей программе с вложенными словарями: я пытаюсь хранить данные карты в астрономическом масштабе. Хотя я не могу создать словари/списки из 10 ^ 6 элементов, вложенных 4 раза (это будет 10 ^ 24 элемента!), Пространство в основном пустое, поэтому я могу полностью оставить пустые значения и назначать только там, где есть что-то. То, что меня колотило, было эффективным способом обработки словарей.