【问题标题】:Where is the source code of python generator send?python生成器的源代码在哪里发送?
【发布时间】: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 created
  • The 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 表达式。

generator.send(value)

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

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

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

【问题讨论】:

    标签: python generator send


    【解决方案1】:

    here类Generator,也找this文件,是Python里面C语言生成器的完整实现

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-19
      • 1970-01-01
      相关资源
      最近更新 更多