Может кто-нибудь объяснить def _tr ie (): вернуть defaultdict (_tr ie) - PullRequest
0 голосов
/ 15 марта 2020

Может кто-нибудь объяснить def _trie(): return defaultdict(_trie)?

Я знаю defaultdict и это похоже на рекурсивную функцию. Но я не понял, как имя функции может стать параметром defaultdict.

Кстати, я получил эту tr ie реализацию от { ссылка }

1 Ответ

1 голос
/ 15 марта 2020

Аргументом для defaultdict является функция.

Начните с вызова _trie:

>>> d = _trie()
>>> d
defaultdict(<function _trie at 0x105a9e400>, {})

Теперь у вас есть экземпляр defaultdict , Что произойдет, если вы попытаетесь получить доступ к несуществующему ключу?

>>> d[3]
defaultdict(<function _trie at 0x105a9e400>, {})

Вы получите еще один defaultdict, потому что d[3] - это сокращение от d.__getitem__(3), вызывает d.__missing__(3) , который вызывает d.__setattr__(d, 3, _trie().

. Он отражает рекурсивное определение tr ie: tr ie является либо пустым, либо единственным узлом с попытками в качестве дочерних элементов. Это создает defaultdict, который либо пуст, либо имеет произвольные ключи, сопоставленные с другими defaultdict с той же заводской функцией.

Это немного похоже на взаимную рекурсию. Вызов _trie приводит к вызову defaultdict, но вызов defaultdict.__getitem__ или defaultdict.__setitem__ (а не сам вызов defaultdict) приводит к вызову _trie.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...