在尝试回答我自己的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
作为协程?
答案 0 :(得分:0)
感谢kennytm的评论,
@first
@second
def main():
print('Done')
相当于
def main():
pass
main = first(second(main))
实际上,@g @f def foo()
会转换为foo=g(f(foo)
。因此,函数的最近装饰器接受函数本身。