首页 > 解决方案 > python生成器的源代码在哪里发送?

问题描述

问题

请帮助查明实现生成器发送部分的 Python 源代码。我想在 github 的某个地方这是 Python 版本 3.8.7rc1但不熟悉存储库的组织方式。

背景

难以理解 PEP 342 和有关生成器发送(值)的文档。因此试图找出它是如何实现理解的。

规范:将值发送到生成器

因为生成器迭代器在生成器函数体的顶部开始执行,所以当生成器刚刚创建时,没有 yield 表达式来接收值。因此,当生成器迭代器刚刚启动时,禁止使用非 None 参数调用 send(),如果发生这种情况(可能是由于某种逻辑错误),则会引发 TypeError。因此,在与协程通信之前,您必须首先调用 next() 或 send(None) 以将其执行推进到第一个 yield 表达式。

生成器.发送(值)

恢复执行并将一个值“发送”到生成器函数中。value 参数成为当前 yield 表达式的结果。send() 方法返回生成器产生的下一个值,或者如果生成器退出而没有产生另一个值,则引发 StopIteration。当调用 send() 来启动生成器时,必须以 None 作为参数调用它,因为没有可以接收该值的 yield 表达式。

我想yield这就像一个 UNIX 系统调用移动到一个例程中,其中保存了堆栈帧和执行指针,并且生成器协同例程被挂起。我认为当调用 save(value) 时,会发生一些技巧,这些技巧与文档中的神秘部分有关。

虽然sent_value = (yield value)是一行语句,但我认为阻塞和恢复都发生在同一行中。执行不会在它之后yield但在其中恢复,因此想知道如何实现块/恢复。我也相信next(generator) is the same with generator.send(None)并想验证。

标签: pythongeneratorsend

解决方案


在这里找生成器类,也找这个文件,是Python里面C上生成器的完整实现


推荐阅读