2017-02-04 27 views
8
इस परिदृश्य में

के रूप में एक coroutine का उपयोग करना:डेकोरेटर

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

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

कॉल बू डेकोरेटर एक async कॉल के लिए एक डेकोरेटर के रूप में foo के लिए है?

--First संपादित करें: भी कैसे एक संभाल सज्जाकार के रूप में coroutines की श्रृंखला बुला करता है?

+2

वह कोड कोई समझ नहीं आता है। इसे चलाने के बाद, 'बू' एक कोरआउट ऑब्जेक्ट है (कोरआउट फ़ंक्शन नहीं)। एक सजावटी के लिए 'async def' का उपयोग करने के लिए यह बिल्कुल उपयोगी नहीं है। 'रैपर' के लिए यह समझ में आ सकता है (हालांकि आप शायद 'f (...) 'से उपज करना चाहते हैं, लेकिन' foo' 'के लिए नहीं। – Blckknght

उत्तर

4

@ 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 

और

def boo(): 
    def wrapper(func): 
     @functools.wraps(func) 
     async def wrapped(*args): 
      # Some fancy boo stuff 
      return await func(*args) 
     return wrapped 
    return wrapper 
दो सज्जाकार के रूप में

, और

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

पर विचार foowork coroutine लपेटकर है, महत्वपूर्ण है awaitपर दोनों सजावट में।

संबंधित मुद्दे