【发布时间】:2018-08-26 21:55:01
【问题描述】:
我试图弄清楚如何使用 CPython api 在 C 中编写生成器函数。不幸的是,我不明白如何做,文档也没有很好地解释它。有人可以解释生成器函数如何在低级代码中工作以及我如何创建它们吗?
类似的东西
def gen_func(*args):
for arg in args:
yield arg
【问题讨论】:
-
你真的需要创建一个生成器,还是可以接受任何迭代器?因为迭代器非常简单(然后这个问题是probably a dup)。同时,如果你想要一个生成器,它只是必须是一个返回生成器迭代器的函数,还是必须像生成器函数一样实际工作?
-
我一直在考虑这个问题,我意识到迭代器很容易完成,并且可以通过
PyRun_String创建生成器,但真正的技巧是创建一个生成器函数,而不是迭代器和它必须像生成器函数一样工作 -
在这种情况下,您可能想看看 Cython 是如何做到的——尽管如果您不习惯阅读 Cython 生成的代码,这可能会很痛苦(当然,如果你不想处理
send/等,不需要伪造回溯等)。创建一个更简单的生成器(def gen_func(): yield 1),将其保存在 .pyx 文件中,cythonize它,然后读取.c文件;函数本身应该有一个__pyx_pf_[mod-name-mangle]_gen_func,而在__next__、send、close和throw方法附近的函数,但很多胆量将在 Cython 中。 -
无论如何,我看到它的感觉是你必须手动完成所有事情 -
__next__基本上是你为迭代器所做的一切,加上管理首次运行标志,以及其他方法也都得写。 -
此外,即使返回简单迭代器的函数是不可接受的,您也应该阅读链接的问题(到目前为止,我只略略略过); OP 开始想要创建一个生成器函数,即使他最终对返回迭代器的函数感到满意。
标签: python c generator cpython