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':
# ...