c++ - 用 Python 生成器替换 C++ STL 输出迭代器

标签 c++ python generics boost python-3.x

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/

相关文章:

c++ - 帮助 Try Catch

c++ - 带有 SSE2 的 Newton Raphson - 有人可以解释一下这 3 行吗

c++ - 是否可以在 C++ 中放入通信 2 fork()?

python - 使用 python 替换电子邮件的正文

python - 使用 wxPython 显示进度

java - 如何声明扩展参数化类型的类型变量?

C# 泛型和 void 的特例

c++ - Qt Widget 中的默认初始化列表

python - python 中的 "Initializing"变量?

kotlin - 暂停直到 StateFlow 达到所需状态之一并返回结果