我希望你能在你的机器上复制这个错误。我不明白为什么下面的代码给了我一个错误【粘贴在后面】,当我让__str__
方法与方法__init__
和{__str__
中给我的变量起了不同的命名。当我得到错误,我只是粘贴代码从链接和它的工作。在
就在这一点上,我意识到我对__str__
方法的缩进与其他方法的缩进不一致。当我将所有内容放入相同的缩进中时,我遇到了相同的错误,因此我将方法返回到其先前的实现中,并得到以下输出:<__main__.Vertex object at 0x1079b4128>
为什么会这样?我不应该从一开始就得到一个IndentationError
?当我缩进我自己版本的__str__
方法并给它更多的缩进时,我没有得到任何错误。为什么?有人能复制这个错误吗?在
class Vertex:
def __init__(self, key):
self.id = key
self.connectedTo = {}
def addNeighbor(self, neighbor, weight=0):
self.connectedTo[neighbor] = weight
def __str__(self):
return str(self.id) + " connected to: " + str([vertex.id for vertex in self.connectedTo])
# def __str__(self):
# return str(self.id) + ' connectedTo: ' + str([x.id for x in self.connectedTo])
if __name__ == '__main__':
vertex = Vertex(1)
vertex.addNeighbor('1', 20)
vertex.addNeighbor('2', 10)
print(vertex)
我得到的错误是:
^{pr2}$
这是因为使用您的缩进,
__str__
是方法addNeighbor
中的一个局部函数。它只在addNeighbor
的范围内可见。如果没有用户定义的__str__
,则使用默认方法。在最初的错误是因为
x.id
中的x
是一个字符串(节点名)。字符串没有id
属性。要使代码正常工作,请将vertex.addNeighbor('1', 20)
等更改为vertex.addNeighbor(Vertex('1'), 20)
。在这里发生了一些事情。在
首先,正如您所说,您的}一致。(否则,它只是
__str__
缩进是错误的。但它仍然是一个有效的缩进,这就是为什么您不能得到IndentationError
。只有在调用__str__
时才会出现错误,只有当它处于正确的缩进级别时才会发生,这是较小的缩进,与__init__
和{addNeighbor
中的一个局部函数,而且非常无用。)一旦调用了
__str__
方法,您得到的错误是由于self.connectedTo
字典的结构造成的。在addNeighbor()
中,您正在映射neighbor: weight
,其中neighbor
作为str
传入,而权重作为int
传入。当您在[x.id for x in self.connectedTo]
中迭代字典时,Python将迭代该字典的键,在本例中是neighbor
,一个字符串。所以x
变成了一个字符串。(列表理解最好写为[x.id for x in self.connectedTo.keys()]
,这与原来的相同,但更清晰。)您链接的页面显示了最初的错误,即
neighbor
应该是另一个Vertex
,而不是str
。这意味着这一切都归结为向addNeighbor()
传递了错误类型的参数。考虑到这一点,我可能会像这样重写你的测试代码。。。在相关问题 更多 >
编程相关推荐