【问题标题】:Self defined __repr__ for pretty print in Python自定义 __repr__ 用于 Python 中的漂亮打印
【发布时间】:2021-07-28 01:14:35
【问题描述】:

我从here 获得了一段代码,关于使用__repr__ 来获得漂亮的打印效果。但是,我想修改这段代码,因为在循环中使用它时,我总是报错: maximum recursion depth exceeded

问题是,我不知道怎么修改,因为我对这个自定义的__repr__不是很清楚,甚至我也看过here的一些解释。

代码:

class node(object):
    def __init__(self, value):
        self.value = value
        self.children = []

    def __repr__(self, level=0):
        ret = "\t"*level+repr(self.value)+"\n"
        for child in self.children:
            ret += child.__repr__(level+1)
        return ret

我的问题:

  1. repr 是否与递归中的__repr__ 相同?
  2. 变量level是否表示recursion的深度?
  3. ret += child.__repr__(level+1) 这一行的目的是什么?

我使用此代码的目的:遍历一棵树并打印如下:

'grandmother'
    'daughter'
        'granddaughter'
        'grandson'
    'son'
        'granddaughter'
        'grandson'

对递归部分非常困惑,感谢任何评论,谢谢!

【问题讨论】:

  • 严格来说,它不是递归,因为即使child 是(如预期的那样)node 的一个实例,每个绑定方法都是一个单独的可调用对象。不过,出于所有实际目的,您可以将其视为递归。
  • repr(self.value),虽然,是self.value.__repr__,这绝对是不是递归,假设self.value不是node的实例。

标签: python python-3.x recursion tree repr


【解决方案1】:

repr 除了调用其参数的__repr__ 方法外,什么都不做。由于self.value 可能不是node 的实例,self.value.__repr__ 不是递归调用。

child.__repr__,出于所有实际目的,一个递归调用,所以你是正确的 level 是递归树中当前调用“深度”的度量。

ret 只是每个孩子的表示的串联。这些与根的表示相结合,生成以当前节点为根的整棵树的表示。

【讨论】:

  • 非常感谢@chepner,如果leveldepth的度量,那么代码中的depth似乎没有限制,会不会出现exceed its max depth的情况?
  • 这是可能的,但除非您的树很大和/或不平衡,否则深度不太可能接近 1000。您需要大约 40 亿个节点才能使平衡树的深度甚至达到 32。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 2012-01-11
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多