如何检测字典是否包含可能最终处于无限循环或导致最大递归深度异常的后端即后向引用.
x = {'a':1} x['b'] = x #referencing same dict,creating back edge print(x) >{'a': 1,'b': {...}}
显然python很聪明,可以找出后边缘,并通过将它们打印为{…}来标记它们.有没有办法访问这些信息,所以可以跳过它,而不检查所有的元素相互之间的id?
解决方法
dict.__repr__
implementation调用
Py_ReprEnter
,一个
reprlib.recursive_repr
的C API模拟,它记录了当前线程正在计算dict的repr的事实.如果再次为该字典输入dict .__ repr__而没有插入Py_ReprLeave,则Python知道它处于递归的repr调用中,并且它使用“{…}”而不是通过通常的逻辑.
您可以在自己的代码中应用类似的技术.在您要编写的任何递归遍历中,记录当前线程当前正在处理的对象,并使用该信息来检测您何时进行循环.根据您要执行的操作和输入结构,可能还有其他有用的技巧.