python - python生成器的源代码在哪里发送?
问题描述
问题
请帮助查明实现生成器发送部分的 Python 源代码。我想在 github 的某个地方这是 Python 版本 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
因为生成器迭代器在生成器函数体的顶部开始执行,所以当生成器刚刚创建时,没有 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)
并想验证。
解决方案
推荐阅读
- sql - bigquery中全外连接的优化
- python - TypeError: 'NoneType' object is not subscriptable 提交表单时显示错误
- if-statement - 编写无法访问的 else 块最优雅的方法是什么
- cucumber - cypress run && node cucumber-html-report.js 断言失败时不生成 html 报告
- javascript - Javascript Websocket onopen未被调用
- g++ - 在没有任何 ABI 库的情况下构建 libstdc++-v3
- python - 如何在不使用 ffmpeg 的情况下使用 Python(音频文件从 .oga 格式转换为 .wav 格式)?
- php - Voyager-hook 无法安装软件包
- azure - 多 AZURE B2C 配置同一个 Spring Boot 资源服务器
- python - 如何在 PyQt5 中制作浮动框架