在这种情况下:
async def foo(f):
async def wrapper(*args, **kwargs):
return f(*args, **kwargs)
return wrapper
@foo
async def boo(*args, **kwargs):
pass
调用foo作为boo decorator的decorator是异步调用吗?
- -第一次编辑:另外,如何处理作为装饰器的协程调用链?
在这种情况下:
async def foo(f):
async def wrapper(*args, **kwargs):
return f(*args, **kwargs)
return wrapper
@foo
async def boo(*args, **kwargs):
pass
调用foo作为boo decorator的decorator是异步调用吗?
4条答案
按热度按时间6qftjkof1#
感谢@ blacknight的评论,考虑到
和/或
作为两个装饰师,以及
由于
foo
Package 了work
协程,因此关键是在两个装饰器中await
func(*arg)
。3qpi33ja2#
你的装饰器需要是一个正常的功能,它会工作得很好。
当一个装饰器被求值时,python会以函数作为参数来执行该方法。
评估结果:
如果foo是异步函数类型(main.boo)将是一个协程对象,而不是函数对象。但是如果foo是一个常规的synch函数,它将立即求值,并且main.boo将作为 Package 器返回。
axr492tv3#
下面是一种使用
decorator
库的替代方法(即pip install decorator
优先):输出:
e5nqia274#
两个关键的更改是等待你正在 Package 的函数,因为它是一个异步函数,以及更改 Package 函数的名称,这样你的程序就不会试图用相同的方式命名多个函数。