如何检查字典中的循环/后沿? {...}

时间:2018-01-12 01:24:46

标签: python dictionary

如何检测字典是否包含可能最终处于无限循环或导致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?

1 个答案:

答案 0 :(得分:7)

dict.__repr__ implementation调用Py_ReprEnter,即reprlib.recursive_repr的C API类似物,它记录了当前线程正在计算字典repr的事实。如果在没有介入dict.__repr__的情况下再次为该字典输入Py_ReprLeave,则Python知道它在递归repr调用中,并且它使用'{...}'而不是去通过通常的逻辑。

您可以在自己的代码中应用类似的技巧。在您要编写的任何递归遍历中,记录当前线程当前正在处理的对象,并使用该信息来检测您何时进行循环。根据您尝试做的事情和输入的结构,可能还有其他有用的技巧。