Я пытаюсь обернуть голову генераторами python, и в результате я пытаюсь напечатать бесконечно вложенные объекты с использованием yield, но я обнаружил, что у меня все еще возникают проблемы с выдуванием стека. В идеале, я хотел бы быть в состоянии дать и печатать каждый элемент, как он приходит, но я не могу понять, что я делаю неправильно:Python бесконечная рекурсия с генераторами
class Parent:
def __init__(self, name, child=None):
self._name = name
self._child = child
def get_name(self):
return self._name
def get_child(self):
return self._child
def set_child(self, child):
self._child = child
def __iter__(self):
next_child = self._child.get_child()
if not next_child:
raise StopIteration
else:
self._child = next_child
yield next_child
def __str__(self):
return "%s has %s" % (self._name, self._child)
if __name__ == '__main__':
p1 = Parent("child")
p2 = Parent("child", p1)
p1.set_child(p2)
for t in p1:
print t
Если вы читали отслеживающий, вы заметите, что ошибка вызвана 'печати Т *, поэтому через 'Parent .__ str__', а не' __iter__'. Вы сами установили это - 'p1' является дочерним элементом' p2', который является дочерним элементом 'p1', который является дочерним элементом' p2', который ... – jonrsharpe