Python 3.2+reprlibфункция
reprlib.recursive_repr()
рекурсивные структуры
Декоратор для __repr__, защищающий от бесконечной рекурсии: при повторном входе в тот же объект возвращает '...'.
Синтаксис
@reprlib.recursive_repr(fillvalue='...')
Встроенные list и dict сами печатают [...] для ссылки на себя, но собственный __repr__, который обращается к атрибутам, при цикле a.other = b, b.other = a уходит в RecursionError. Декоратор отслеживает пары (объект, поток), так что работает и при многопоточности. Обратите внимание на скобки: @recursive_repr(), а @recursive_repr без вызова сломает класс.
Примеры
import reprlib
class Node:
@reprlib.recursive_repr()
def __repr__(self):
return f'Node({self.other!r})'
a, b = Node(), Node()
a.other, b.other = b, a
print(repr(a)) # → Node(Node(...))
class Node:
def __repr__(self):
return f'Node({self.other!r})'
a, b = Node(), Node()
a.other, b.other = b, a
repr(a) # → RecursionError: maximum recursion depth exceeded
См. также
Частые ошибки
Открыть в полном глоссарииdocs.python.orgСообщить о неточности