如何检测字典是否包含可能最终处于无限循环或导致back-edge
异常的back-reference
又名maximum recursion depth
。
x = {'a':1}
x['b'] = x #referencing same dict, creating back edge
print(x)
>{'a': 1, 'b': {...}}
显然python非常聪明,可以找出back-edges
并通过将它们打印为{...}
来标记它们。有没有办法访问这些信息,所以可以跳过它,而不检查所有的元素是否相互对应他们的id?
答案 0 :(得分:7)
dict.__repr__
implementation调用Py_ReprEnter
,即reprlib.recursive_repr
的C API类似物,它记录了当前线程正在计算字典repr
的事实。如果在没有介入dict.__repr__
的情况下再次为该字典输入Py_ReprLeave
,则Python知道它在递归repr
调用中,并且它使用'{...}'
而不是去通过通常的逻辑。
您可以在自己的代码中应用类似的技巧。在您要编写的任何递归遍历中,记录当前线程当前正在处理的对象,并使用该信息来检测您何时进行循环。根据您尝试做的事情和输入的结构,可能还有其他有用的技巧。