协同作用链子作为装饰员

时间:2017-03-14 09:26:54

标签: python decorator coroutine

在尝试回答我自己的question(无论如何部分)之后,其他一些东西对我来说仍然未知。请考虑以下情况:

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)

正如您在print(f)wrapped()中的first(f) second(f)内所见,first()second()视为协程对象,但second()main()作为function()。为什么会这样?为什么second()也没有将main作为协程?

1 个答案:

答案 0 :(得分:0)

感谢kennytm的评论,

@first
@second
def main():
    print('Done')

相当于

def main():
    pass
main = first(second(main))

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