Python repr/str NoneType 没有属性

Python repr/str NoneType has no attribute

嗨,我最近遇到了一些奇怪的事情。我有以下 class:

class TreeNode:
    def __init__(self, name, parent):
        self.name = name
        self.parent = parent
        self.children = []

    def __str__(self):
        string = "---- TreeNode Object ---- \n" + \
            "name: {} \n".format(self.name) + \
            "parent: {} \n".format(self.parent.name) + \
            "number of children: {} \n".format(len(self.children))
        return string

现在我有一个存储在 tmp 中的实例字典,键是实例的名称,不知何故它具有以下行为

print(tmp["650"].name)
>>> 650
try:
    print(tmp["650"])
except Exception as e:
    print(e)
>>> 'NoneType' object has no attribute 'name'

这只会发生在 dict 的一个实例上,其余的都可以正常工作。我以相同的方式初始化了所有实例,所以这让我很困惑。

print(tmp["632"].name)
>>> 632
try:
    print(tmp["632"])
except Exception as e:
    print(e)
>>> ---- TreeNode Object ---- 
>>> Name: 632 
>>> parent: 650 
>>> number of children: 3 

我试图搜索,但关于 str/repr 的 NoneType 异常的信息似乎很少。感谢阅读,如果您需要更多信息,请告诉我。

您的一个 TreeNode 实例具有 None 作为 parent 属性。在这种情况下,您正在尝试恢复不存在的 None.name

要处理没有父节点的节点,您应该在 __str__ 方法中通过替换...

来说明这一点
"parent: {} \n".format(self.parent.name)

由...

"parent: {} \n".format(self.parent.name if self.parent else None)

例子

class TreeNode:
    def __init__(self, name, parent):
        self.name = name
        self.parent = parent
        self.children = []

    def __str__(self):
        string = "---- TreeNode Object ---- \n" + \
            "name: {} \n".format(self.name) + \
            "parent: {} \n".format(self.parent.name if self.parent else None) + \
            "number of children: {} \n".format(len(self.children))
        return string

输出

>>> print(TreeNode('foo', None))
---- TreeNode Object ---- 
name: foo
parent: None 
number of children: 0