2012-12-17 34 views
5

decorator module और functools.wraps की कार्यक्षमता बनाम निकट से संबंधित है। दोनों के बीच मतभेद क्या हैं (पायथन 3.3/3.4 के रूप में)? , 3+ years ago, decorator समर्थित मदद जबकि wraps नहीं (भी this देखें) था:डेकोरेटर मॉड्यूल functools.wraps

मैं एक अंतर के बारे में पता कर रहा हूँ।

+0

एक और उदाहरण: [सजाए गए कार्यों के हस्ताक्षर संरक्षित] (http://stackoverflow.com/q/147816/4279) – jfs

उत्तर

5

मुख्य अंतरों में से एक को आपके द्वारा लिंक किए गए दस्तावेज़ में सही सूचीबद्ध किया गया है: decorator लपेटा हुआ फ़ंक्शन के हस्ताक्षर को सुरक्षित रखता है, जबकि wraps नहीं है।

+0

ऐसा लगता है कि यह मामला नहीं है, क्या यह सही है? –

+0

@CheeltenBrinke: आपका मतलब है कि 'functools.wraps' अब हस्ताक्षर को सुरक्षित रखता है? मुझे दस्तावेज़ों में इसके बारे में कुछ भी दिखाई नहीं देता है, लेकिन मेरे पास परीक्षण करने के लिए पाइथन 3.5 स्थापित नहीं है। – BrenBarn

+0

डॉक्स में नहीं इसकी सहमत है, लेकिन अजगर खोल (3.4) में यह परीक्षण यह –

1

BrenBarn साथ चर्चा के अनुसार, आजकल functools.wraps भी लपेटा समारोह के हस्ताक्षर बरकरार रखता है। आईएमएचओ यह decorator सजावटी लगभग अप्रचलित बनाता है।

from inspect import signature 
from functools import wraps 

def dec(func): 
    def wrapper(*args, **kwargs): 
     return func(*args, **kwargs) 
    return wrapper 

def dec2(func): 
    @wraps(func) 
    def wrapper(*args, **kwargs): 
     return func(*args, **kwargs) 
    return wrapper 

def foo(a: int, b): 
    pass 

print(signature(dec(foo))) 
print(signature(dec2(foo))) 

# Prints: 
# (*args, **kwargs) 
# (a:int, b) 

नोट एक signature और नहीं getargspec उपयोग करने के लिए है। पाइथन 3.4 के साथ परीक्षण किया।

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