2017-02-04 5 views
8

としてコルーチンを使用する:このシナリオではデコレータ

async def foo(f): 
    async def wrapper(*args, **kwargs): 
     return f(*args, **kwargs) 
    return wrapper 

@foo 
async def boo(*args, **kwargs): 
    pass 

はブーイングデコレータ非同期呼び出しのためのデコレータとしてfooに呼び出しているのですか?

- 最初の編集: また、コルーチンのチェーンをデコレータとして呼び出す方法はありますか? 2つのデコレータとして

def foo(): 
    def wrapper(func): 
     @functools.wraps(func) 
     async def wrapped(*args): 
      # Some fancy foo stuff 
      return await func(*args) 
     return wrapped 
    return wrapper 

def boo(): 
    def wrapper(func): 
     @functools.wraps(func) 
     async def wrapped(*args): 
      # Some fancy boo stuff 
      return await func(*args) 
     return wrapped 
    return wrapper 

を考慮する@ blacknghtさんのコメントに

+2

そのコードは意味をなさない。実行後、 'boo'はコルーチンオブジェクトです(コルーチン関数ではありません)。デコレータに 'async def'を使用することは、まったく役に立ちません。 'wrapper'の場合は、' f(...)から得たいと思うかもしれませんが、それは意味がありますが、 'foo'自体のためではありません。 – Blckknght

答えて

4

おかげで、と

@foo() 
@boo() 
async def work(*args): 
    pass 

fooworkコルーチンをラップすると、キーがあります〜await両方のデコレータの。

関連する問題