В поисках способа работы с вложенными словарями я нашел следующий код, отправленный 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 элемента!), Пространство в основном пустое, поэтому я могу полностью оставить пустые значения и назначать только там, где есть что-то. То, что меня колотило, было эффективным способом обработки словарей.