首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >作为装饰器的协程程序链

作为装饰器的协程程序链
EN

Stack Overflow用户
提问于 2017-03-14 17:26:54
回答 1查看 263关注 0票数 0

在尝试回复我自己的question (不管是不是部分的)之后,还有一些东西对我来说仍然是未知的。考虑以下场景:

代码语言:javascript
复制
import asyncio

async def first(f):
    async def wrapped():
        await asyncio.sleep(0.3)  # Something time-consuming
        print(f)  # <coroutine object second at 0x7fd39f4ff150>
        await f
    await wrapped()


async def second(f):
    async def wrapped():
        await asyncio.sleep(0.3)  # Something time-consuming
        print(f)  # <function main at 0x7fd39fe7d7b8>
        await f()
    await wrapped()


@first
@second
async def main():
    print('done')


if __name__ == '__main__':
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main)

first(f)second(f)中的wrapped()协程中的print(f)中可以看到,first()second()作为协程对象,而second()main()作为function()。为什么会这样呢?为什么second()不把main作为一个协程呢?

EN

回答 1

Stack Overflow用户

发布于 2017-03-16 22:15:27

感谢kennytm的评论,

代码语言:javascript
复制
@first
@second
def main():
    print('Done')

等同于

代码语言:javascript
复制
def main():
    pass
main = first(second(main))

实际上,@g @f def foo()转换为foo=g(f(foo)。因此,离函数最近的装饰器接受函数本身。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42782115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档