如何将版本 3.x "yield from" 转换为与 2.7 版本兼容的版本?

How to convert version 3.x "yield from" to something compatible in version 2.7?

这适用于 Python 3.5。我知道 yield from 在 python 2.7 中不可用。如何使用 python 2.7 实现 depth_first() 功能?

以下解决方案对我没有帮助: Converting "yield from" statement to Python 2.7 code

class Node:
 def __init__(self, value):
    self._value = value
    self._children = []

 def __repr__(self):
    return 'Node({!r})'.format(self._value)

 def add_child(self, node):
    self._children.append(node)

 def __iter__(self):
    return iter(self._children)

 def depth_first(self):
    yield self
    for c in self:
        yield from c.depth_first()

# Example
if __name__ == '__main__':
    root = Node(0)
    child1 = Node(1)
    child2 = Node(2)
    root.add_child(child1)
    root.add_child(child2)
    child1.add_child(Node(3))
    child1.add_child(Node(4))
    child2.add_child(Node(5))
    for ch in root.depth_first():
        print(ch)

这是预期的输出:

Node(0), Node(1), Node(3), Node(4), Node(2), Node(5)

yield from 转换为具有简单 yield 的 for 循环。

class Node: 转换为 class Node(object): 以确保您获得新样式 class。

代码现在可以在 Python 2.7 中运行。

class Node(object):
 def __init__(self, value):
    self._value = value
    self._children = []

 def __repr__(self):
    return 'Node({!r})'.format(self._value)

 def add_child(self, node):
    self._children.append(node)

 def __iter__(self):
    return iter(self._children)

 def depth_first(self):
    yield self
    for c in self:
        for n in c.depth_first():
            yield n

# Example
if __name__ == '__main__':
    root = Node(0)
    child1 = Node(1)
    child2 = Node(2)
    root.add_child(child1)
    root.add_child(child2)
    child1.add_child(Node(3))
    child1.add_child(Node(4))
    child2.add_child(Node(5))
    for ch in root.depth_first():
        print(ch)