Как визуализировать и понять этот кусок кода - PullRequest
1 голос
/ 31 октября 2019

Я сталкивался с этим кодом из https://quanttype.net/posts/2016-03-29-defaultdicts-all-the-way-down.html, и я не могу понять, как и почему это работает. Я хотел бы знать, как кто-то может визуализировать это и понять это

Запуск этого в отладчике не дал понимания

def fix(f):
    return lambda *args, **kwargs: f(fix(f), *args, **kwargs)

>>> from collections import defaultdict
>>> d = fix(defaultdict)()
>>> d["a"]["b"]["c"]
defaultdict(<function <lambda> at 0x105c4bed8>, {})

1 Ответ

0 голосов
/ 31 октября 2019

Давайте рассмотрим немного более простую версию 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).

...