Jug*_*aut 15 python asynchronous python-3.x
在这种情况下:
async def foo(f):
async def wrapper(*args, **kwargs):
return f(*args, **kwargs)
return wrapper
@foo
async def boo(*args, **kwargs):
pass
Run Code Online (Sandbox Code Playgroud)
是调用foo作为boo装饰器和异步调用的装饰器?
--First Edit:另外如何处理作为装饰器的coroutines调用链?
小智 22
def foo(f):
async def wrapper(*args, **kwargs):
return await f(*args, **kwargs)
return wrapper
@foo
async def boo(*args, **kwargs):
pass
Run Code Online (Sandbox Code Playgroud)
你的装饰器需要是一个正常的功能,它会正常工作。
当一个装饰器被评估时,python 以函数作为参数执行该方法。
@foo
async def boo():
pass
Run Code Online (Sandbox Code Playgroud)
评估为:
__main__.boo = foo(boo)
Run Code Online (Sandbox Code Playgroud)
如果 foo 是一个异步函数类型(main .boo )将是一个协程对象,而不是一个函数对象。但是如果 foo 是一个常规的同步函数,它会立即求值并且main .boo 将是返回的包装器。
Jug*_*aut 20
感谢@ blacknght的评论,考虑一下
def foo():
def wrapper(func):
@functools.wraps(func)
async def wrapped(*args):
# Some fancy foo stuff
return await func(*args)
return wrapped
return wrapper
Run Code Online (Sandbox Code Playgroud)
和
def boo():
def wrapper(func):
@functools.wraps(func)
async def wrapped(*args):
# Some fancy boo stuff
return await func(*args)
return wrapped
return wrapper
Run Code Online (Sandbox Code Playgroud)
作为两个装饰者,和
@foo()
@boo()
async def work(*args):
pass
Run Code Online (Sandbox Code Playgroud)
由于foo被包装的work协程,关键是要await在func(*arg)两个装饰.
| 归档时间: |
|
| 查看次数: |
8896 次 |
| 最近记录: |