2008-11-11 19 views
9

मेरे पास किसी और द्वारा लिखित एक जटिल सजावटी है। मैं जो करना चाहता हूं वह एक समय के आधार पर समारोह के सजाए गए संस्करण को कॉल करता है या किसी अन्य समय मूल फ़ंक्शन (सजाया नहीं जाता) पर कॉल करता है। क्या यह संभव है?कॉल से पहले पायथन सजावट कार्य

उत्तर

26

के साथ:

decorator(original_function)() 

के बिना:

original_function() 

एक डेकोरेटर सिर्फ एक समारोह जो एक तर्क के रूप में एक समारोह लेता है और एक और एक रिटर्न है। @ वाक्यविन्यास पूरी तरह से वैकल्पिक है। शायद documentation के माध्यम से एक चीज चीजों को स्पष्ट करने में मदद कर सकती है।

+0

लिंक टूटा हुआ है :( –

+0

लिंक ठीक है :) – chishaku

2
def original_function(): 
    pass 

decorated_function= decorator(original_function) 

if use_decorated: 
    decorated_function() 
else: 
    original_function() 

केवल एक बार सजाने के लिए, और बाद में कौन सा संस्करण कॉल करना है चुनें।

1

यहां नुस्खा है जो मैं समस्या के लिए आया था। मुझे हस्ताक्षर रखने की भी आवश्यकता थी इसलिए मैंने सजावटी मॉड्यूल का उपयोग किया लेकिन आप इससे बचने के लिए पुनः-जिग कर सकते थे। असल में, चाल फ़ंक्शन में एक विशेषता जोड़ना था। 'मूल' फ़ंक्शन अनबाउंड है, इसलिए आपको पहले पैरामीटर के रूप में 'स्वयं' में प्रवेश करने की आवश्यकता है, इसलिए मैंने इसके लिए कुछ अतिरिक्त कोड भी जोड़ा।

# http://www.phyast.pitt.edu/~micheles/python/decorator-2.0.1.zip 
from decorator import decorator, update_wrapper 

class mustbe : pass 

def wrapper (interface_) : 
    print "inside hhh" 
    def call (func, self, *args, **kwargs) : 
     print "decorated" 
     print "calling %s.%s with args %s, %s" % (self, func.__name__, args, kwargs) 
     return interface_ (self, *args, **kwargs) 
    def original (instance , *args, **kwargs) : 
     if not isinstance (instance, mustbe) : 
      raise TypeError, "Only use this decorator on children of mustbe" 
     return interface_ (instance, *args, **kwargs) 
    call = decorator (call, interface_) 
    call.original = update_wrapper (original, call) 
    return call 

class CCC (mustbe): 
    var = "class var" 
    @wrapper 
    def foo (self, param) : 
     """foo""" 
     print self.var, param 

class SSS (CCC) : 
    @wrapper (hidden_=True) 
    def bar (self, a, b, c) : 
    print a, b, c 

if __name__ == "__main__" : 
    from inspect import getargspec 

    print ">>> i=CCC()" 
    i=CCC() 

    print ">>> i.var = 'parrot'" 
    i.var = 'parrot' 

    print ">>> i.foo.__doc__" 
    print i.foo.__doc__ 

    print ">>> getargspec(i.foo)" 
    print getargspec(i.foo) 

    print ">>> i.foo(99)" 
    i.foo(99) 

    print ">>> i.foo.original.__doc__" 
    print i.foo.original.__doc__ 

    print ">>> getargspec(i.foo.original)" 
    print getargspec(i.foo.original) 

    print ">>> i.foo.original(i,42)" 
    i.foo.original(i,42) 

    print ">>> j=SSS()" 
    j=SSS() 

    print ">>> j.bar(1,2,3)" 
    j.bar(1,2,3) 
संबंधित मुद्दे