2017-02-04 29 views
8

trong kịch bản này:Sử dụng một coroutine như trang trí

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

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

là cuộc gọi đến foo như một trang trí cho boo trang trí một cuộc gọi async?

--Chỉnh sửa đầu tiên: Đồng thời, cách xử lý chuỗi gọi của coroutines như trang trí?

+2

Mã đó không có ý nghĩa gì. Sau khi nó chạy, 'boo' là một đối tượng coroutine (không phải là một hàm coroutine). Nó không phải là ở tất cả hữu ích để có sử dụng 'async def' cho một trang trí. Đối với 'wrapper', nó có thể có ý nghĩa (mặc dù bạn có thể muốn' thu được từ f (...) '), nhưng không phải cho chính' foo'. – Blckknght

Trả lời

4

Nhờ comment @ blacknght của, coi

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 

như hai trang trí, và

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

Khi foo được gói các work coroutine, chính là đến await số func(*arg) trong cả hai trang trí.

Các vấn đề liên quan