tg-me.com/BookPython/3468
Last Update:
Когда вы создаете кастомный метод __repr__
для объекта, обычно нужно включить представление его атрибутов. Однако важно помнить, что нужно явно вызывать repr()
, так как форматирование вызывает str()
вместо repr()
.
Пример простого кода:
class Pair:
def __init__(self, left, right):
self.left = left
self.right = right
def __repr__(self):
class_name = type(self).__name__
repr_left = repr(self.left)
repr_right = repr(self.right)
return f'{class_name}({repr_left}, {repr_right})'
Проблема возникает, если вы вызываете
repr
для объекта, который содержит ссылку на самого себя. Это может привести к рекурсии:
In : p = Pair(1, 2)
In : p
Out: Pair(1, 2)
In : p.right = p
In : p
Out: [...]
RecursionError: maximum recursion depth exceeded while calling a Python object
Для решения этой проблемы можно использовать декоратор
reprlib.recursive_repr
, который обрабатывает рекурсивные вызовы:
@reprlib.recursive_repr()
def __repr__(self):
class_name = type(self).__name__
repr_left = repr(self.left)
repr_right = repr(self.right)
return f'{class_name}({repr_left}, {repr_right})'
Теперь код работает корректно:
In : p = Pair(1, 2)
In : p.right = p
In : p
Out: Pair(1, ...)
👉@BookPython
BY Библиотека Python разработчика | Книги по питону
Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283
Share with your friend now:
tg-me.com/BookPython/3468