【发布时间】:2021-03-29 02:53:33
【问题描述】:
问题
请帮助查明实现生成器发送部分的 Python 源代码。我想在 github This is Python version 3.8.7rc1 的某个地方,但不熟悉存储库的组织方式。
背景
难以理解 PEP 342 和有关生成器发送(值)的文档。因此试图找出它是如何实现理解的。
there is no yield expression to receive a value when the generator has just been createdThe value argument becomes the result of the **current yield expression**. The send() method returns the **next value yielded by the generator
Specification: Sending Values into Generators
因为生成器-迭代器从顶部开始执行 生成器的函数体,没有yield表达式接收a 生成器刚刚创建时的值。因此,调用 当生成器时,禁止使用非 None 参数的 send() 迭代器刚刚启动,如果发生这种情况会引发 TypeError (大概是由于某种逻辑错误)。因此,在你可以之前 与协程通信,您必须先调用 next() 或 send(None) 将其执行推进到第一个 yield 表达式。
恢复执行并将一个值“发送”到生成器函数中。 value 参数成为当前收益率表达式的结果。 send() 方法返回生成器产生的下一个值,或者 如果生成器退出而没有产生另一个,则引发 StopIteration 价值。当调用 send() 启动生成器时,必须调用 以 None 作为参数,因为没有 yield 表达式 可以收到价值。
我想yield 就像一个 UNIX 系统调用移动到一个例程中,其中堆栈帧和执行指针被保存并且生成器协同例程被挂起。我认为当调用 save(value) 时,会发生一些技巧,这些技巧与文档中的神秘部分有关。
虽然sent_value = (yield value) 是一行语句,但我认为阻塞和恢复都发生在同一行中。执行不会在yield 之后恢复,而是在其中执行,因此想知道块/恢复是如何实现的。我也相信next(generator) is the same with generator.send(None) 并想验证一下。
【问题讨论】: