【问题标题】:Printing a parse tree :AttributeError: 'NoneType' object has no attribute 'data'打印解析树:AttributeError:“NoneType”对象没有属性“数据”
【发布时间】:2020-04-20 13:52:45
【问题描述】:

该类应基于后缀字符串生成解析树,然后在根节点上递归调用打印函数以打印解析树,但我不断收到以下错误:第 15 行, 在中缀打印节点 self.right.infixPrintNode() AttributeError: 'NoneType' 对象没有属性 'infixPrintNode'

我是 python 新手,我认为错误与实例相关,我真的很困惑,希望能得到一些澄清

    import operator


class Node:
    def __init__(self, data, left=None, right=None):
        self.data, self.left, self.right = data, left, right

    def __str__(self):
        return self.data

    def infixPrintNode(self):

        if self:
            if self.right:
                return self.right.infixPrintNode()
            print(self.data)
            if self.left:
                return self.left.infixPrintNode()






class ParseTree:

    def __init__(self, root = None):
        self.root = (root)
    def __str__(self):
         pass # to be implemented

    def fromPostfix(self, expression=""):

        s=[] #maintain parents


        for c in expression.split():
             if c in ["+", "-", "*", "/", "^", "#"]:
                 n=Node(c)

                 n.right = s.pop()
                 n.left=s.pop()
                 s.append(n)

             elif c.isnumeric() or c.isalpha() :
                  n=Node(c)
                  s.append(n)

             else:

                     raise ValueError("Invalid token! ")

        self.root = (s.pop())
        print(self.root.left.data)
        print(self.root.data)
        print(self.root.right.data)
        return self.root #or  Node(s.pop())


    def printinfix(self):


        if self.root:
            self.root.infixPrintNode()


t=ParseTree("x y +")
t.fromPostfix("x y +")
t.printinfix()

【问题讨论】:

  • 快速查看您的代码可以看出,您只使用一个参数实例化您的 Node 类,self.leftself.right 默认为 None
  • 您还可以在它之后立即用self.root = Node(s.pop()) 实例化一个新的Node 实例。这意味着self.root 没有self.leftself.right 属性。
  • @misu:从错误消息中可以明显看出,您有一个node,其right 属性为None。如果你想调试你的程序,你需要弄清楚它是如何发生的。否认它是可能的对你没有帮助。
  • @misu 您的主要问题在于self.right.infixPrintNode()。在某些时候,您的self.right 属性将没有self.right 属性,除非您有无限的Nodes。以您的elif 块中的n=Node(c) 为例。在您的示例中,它将在到达将它们分配给self.leftself.right 的点之前两次到达此点。这意味着这两个实例都没有 self.leftself.right 属性。
  • @Misu 那是因为您正在返回 self.right.infixPrintNode() 而不仅仅是调用它。如果您 return 将永远不会到达您的 print(self.data)self.left.infixPrintNode() 对于您的第一个案例。

标签: python python-3.x oop parsing tree


【解决方案1】:

这里是:

def __init__(self, data, left=None, right=None):

你只传递了数据,所以left和right仍然是None。

 n=Node(c)

所以你得到:

'NoneType' object has no attribute 'infixPrintNode'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-13
    • 2018-12-09
    • 2019-01-01
    • 2021-12-26
    • 2019-07-23
    相关资源
    最近更新 更多