如何在Python中处理递归repr()?

2024-10-01 11:32:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我用Python编写了一个容器类型,并试图编写一个健壮的__repr__方法,它可以正确地处理容器本身包含的情况。在

例如,以下是内置的list的功能:

>>> x = []
>>> x.append(x)
>>> repr(x)
'[[...]]'

用C为CPython编写的容器类型可以通过使用Py_ReprEnterPy_ReprLeave来实现这个功能。纯Python中是否有相同的功能,或者我需要创建自己的功能?在


Tags: 方法py功能类型情况cpython内置容器
2条回答

您可以创建自己的标记,但如果您想正确地创建,则会有点麻烦:您不应该在对象本身上存储“being repr'd”标记标志,因为这不是线程安全的。相反,您可以存储正在被代表的实例的线程本地集

一个更便宜的解决方案是依赖于一个内置的repr来处理递归,例如:

def __init__(self, *list):
    self._list= list
def __repr__(self):
    return 'mything('+repr(self._list)[1:-1]+')')

只要递归循环中的一个对象导致Py_ReprEnter发生,repr就不能形成完整的循环。在

How do I create a thread-local set of instances?

对于threading模块:

^{pr2}$

如果您使用的是python3,那么可以使用reprlib.recursive_repr装饰器。在

相关问题 更多 >