Python 没有内置的 OutputIterator 等价物;特别是,内置或标准库容器不支持任何允许客户端代码在不知道特定容器类型的情况下向它们发送数据的通用接口(interface)。
根据 @Steven Rumbalski's comment和 @Glenn Maynard's answer ,这通常不是问题,因为在 C++ 中的函数将采用 OutputIterator 参数,在 Python 中将简单地编写为生成器。
通常,我在使用生成器时没有问题,而且从来没有觉得我需要 Python 中的 OutputIterator。但是,在这种情况下,我被卡住了。
我正在用 Python 重新实现 Boost Graph 库中的一些算法。一个典型的图遍历算法,比如 depth_first_search
,将“访问者”对象作为参数。访问者本质上是一组回调函数,遍历算法在执行过程中遇到不同事件(例如,发现新顶点、检查边等)时会调用这些回调函数。在 C++ 中,我可以让这些回调函数中的一个或多个将数据发送到访问者对象在其初始化时从客户端代码获得的 OutputIterator 对象。 (例如,这正是 topological_sort
的实现方式:它采用 OutputIterator,将其传递给 dfs_visitor
对象,然后访问者对象“监视”事件 finished_vertex
并将接收到的顶点发送给指定的OutputIterator。当然,更复杂的情况需要多个OutputIterator对象和多个回调函数。)
如何使用 Python 生成器实现同样的目的?
我需要以某种方式将数据以生成器“样式”从 depth_first_search
发送到多个指定的数据消费者。我只是不知道该怎么做。 (我使用的是 Python 3.3。)
最佳答案
能不能只传回调函数?
def depth_first_search(some_args, on_edge=lambda e:None, on_vertex=lambda v:None):
...
on_edge(some_edge)
on_vertex(some_vertex)
def edge_handler(e):
print "E", e
def vertex_handler(v):
print "V", v
depth_first_search(..., on_edge=edge_handler, on_vertex=vertex_handler)
或者产生一个目的地:
def depth_first_search(some_args, on_edge=lambda e:None, on_vertex=lambda v:None):
...
yield "edge", some_edge
yield "vertex", some_vertex
for t, value in depth_first_search(...):
if t == 'edge':
# ...
elif t == 'vertex':
# ...
关于c++ - 用 Python 生成器替换 C++ STL 输出迭代器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16208981/