Python中的yield from的用法?

发布于 2022-09-04 18:05:08 字数 995 浏览 15 评论 0

对于yield from目前我只知道这一种用法,我对它的理解也停留在yield from generator

In [1]: def reader():
   ...:     """A generator that fakes a read from a file, socket, etc."""
   ...:     for i in range(4):
   ...:         yield '<< %s' % i
   ...:         

In [2]: def reader_wrapper(g):
   ...:     yield from g
   ...:     

In [3]: wrap = reader_wrapper(reader())

In [4]: for i in wrap:
   ...:     print(i)
   ...:     
<< 0
<< 1
<< 2
<< 3

但是在廖雪峰的异步IO教程中看见一个yield from的新用法,请问下面这个yield from asyncio.sleep(1)是什么意思,asyncio.sleep(1)也是一个生成器吗?看官方文档也没有给出明确的解释,也是直接贴的代码,拜托大神解释一下!

import asyncio

@asyncio.coroutine
def hello():
    print("Hello world!")
    # 异步调用asyncio.sleep(1):
    r = yield from asyncio.sleep(1)
    print("Hello again!")

# 获取EventLoop:
loop = asyncio.get_event_loop()
# 执行coroutine
loop.run_until_complete(hello())
loop.close()

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

清泪尽 2022-09-11 18:05:08

首先找到asyncio.sleep()函数的定义

coroutine asyncio.sleep(delay, result=None, *, loop=None)

也就是说这个函数是一个协程(coroutine)函数, 协程函数可以这样调用来得到返回值

result = await coroutine or result = yield from coroutine 

至于为什么可以这么用?

  1. await本身就是用在协程的一个关键词.

  2. 可以用yield关键词, 是因为coroutine的实现是基于生成器的(Generator-based),至于为什么用yield from而不是原始的yield, 这肯定是有来源的,可以看PEP380. 总而言之就是用yield来获取协程的信息比较麻烦,于是就加了个yield from 来简化操作.
    https://www.python.org/dev/pe...

总结以下: 可以用yield是因为coroutine是generator-based的,所以你说sleep返回的是generator其实也不算错, 为什么出现了from是因为只用yield太麻烦, 你可以认为是一个语法糖.具体可以看PEP8.

PS:最后再BB几句, 这就是我为什么不推荐看博客学习一门语言的原因, 同样是免费的, 为什么不选择更加权威细致的python官方文档?

木落 2022-09-11 18:05:08

协程的本质就是是生成器

可以看看这个视频~
探索 Python 3.5 中 async/await 特性的实现

薄凉少年不暖心 2022-09-11 18:05:08

为什么要包装一次了?

for i in reader():
    print(i)

这样也能用啊?很纳闷。。。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文