Здесь происходит несколько вещей.
Прежде всего, как вы сказали, ваше отступление от __str__
неверно. Но это все равно действительный отступ, поэтому вы не получите IndentationError
. Ошибка появляется только тогда, когда вызывается __str__
, что происходит только при правильном уровне отступа, который является меньшим отступом, в соответствии с __init__
и addNeighbor
. (В противном случае, это просто локальная функция внутри 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()]
, что эквивалентно оригиналу, но более четкое.)
На странице, на которую вы ссылались, указана первоначальная ошибка, хотя & ndash; а именно, что neighbor
должно быть другим Vertex
, а не str
. Смысл все сводится к передаче неправильного типа аргумента в addNeighbor()
. Поэтому, учитывая это, я могу переписать ваш тестовый код следующим образом ...
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) + ' connectedTo: ' + str([x.id for x in self.connectedTo])
if __name__ == '__main__':
vertex = Vertex(1)
vertex.addNeighbor(Vertex(1), 20) # This creates a second Vertex with the same ID
# as `vertex` -- probably not what you intend?
vertex.addNeighbor(Vertex(2), 10)
print(vertex)
# Output:
1 connected to: [1, 2]