Давайте рассмотрим немного более простую версию fix
:
def fix(f):
return lambda: f(fix(f))
Когда мы вызываем fix(defaultdict)
, мы, конечно, получаем lambda: defaultdict(fix(defaultdict))
. Он будет возвращать отдельный lambda
каждый раз, но все эти lambda
функции имеют одинаковый чистый эффект. Когда вызывается первый lambda
, он создает другой и устанавливает его как фабрику для defaultdict
, который он возвращает.
defaultdict
, который мы получим, будет использовать lambda
создать значения по умолчанию. Поэтому, когда пара ключ-значение вставляется, значение становится другим по умолчанию, которое имеет собственную лямбду, которая может делать то же самое.
Это позволяет нам хранить ключи настолько глубоко, насколько мы хотим, без создания подпрограммы. -dicts в первую очередь, потому что на каждом уровне новый слой будет автоматически создаваться при необходимости (и этот слой настроен для создания следующего при необходимости и т. д.).
fix
в реальном кодепросто перенаправляет дополнительные параметры в конструктор defaultdict
. Образец кода не использует эту функциональность, но его можно использовать для инициализации содержимого, а не назначать их по одному (подробнее см. Документацию defaultdict
).