2024-10-01 11:32:49 发布
网友
我用Python编写了一个容器类型,并试图编写一个健壮的__repr__方法,它可以正确地处理容器本身包含的情况。在
__repr__
例如,以下是内置的list的功能:
list
>>> x = [] >>> x.append(x) >>> repr(x) '[[...]]'
用C为CPython编写的容器类型可以通过使用Py_ReprEnter和Py_ReprLeave来实现这个功能。纯Python中是否有相同的功能,或者我需要创建自己的功能?在
Py_ReprEnter
Py_ReprLeave
您可以创建自己的标记,但如果您想正确地创建,则会有点麻烦:您不应该在对象本身上存储“being repr'd”标记标志,因为这不是线程安全的。相反,您可以存储正在被代表的实例的线程本地集
一个更便宜的解决方案是依赖于一个内置的repr来处理递归,例如:
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模块:
如果您使用的是python3,那么可以使用reprlib.recursive_repr装饰器。在
您可以创建自己的标记,但如果您想正确地创建,则会有点麻烦:您不应该在对象本身上存储“being repr'd”标记标志,因为这不是线程安全的。相反,您可以存储正在被代表的实例的线程本地集
一个更便宜的解决方案是依赖于一个内置的
repr
来处理递归,例如:只要递归循环中的一个对象导致
Py_ReprEnter
发生,repr
就不能形成完整的循环。在对于threading模块:
^{pr2}$如果您使用的是python3,那么可以使用reprlib.recursive_repr装饰器。在
相关问题 更多 >
编程相关推荐