Вы можете создать свой собственный, но это немного болезненно, если вы хотите сделать это правильно: вы не должны хранить флаг-метку «repr'd» на самом объекте, потому что он не является потокобезопасным. Вместо этого вы можете хранить локальный для потока набор ваших экземпляров, для которых выполняется повторение.
Гораздо более дешевое решение - зависеть от встроенного repr
, который заботится о рекурсии, например ::1004
def __init__(self, *list):
self._list= list
def __repr__(self):
return 'mything('+repr(self._list)[1:-1]+')')
Пока один объект в цикле рекурсии вызывает Py_ReprEnter
, repr
не может сформировать полный цикл.
Как создать поток-локальный набор экземпляров?
С модулем Threading :
class MyThing(object):
_local= threading.local()
_local.reprs= set()
def __repr__(self):
reprs= MyThing._local.reprs
sid= id(self)
if sid in reprs:
return 'MyThing(...)'
try:
reprs.add(sid)
return 'MyThing(%r)' % self.something
finally:
reprs.remove(sid)