मेरे पास किसी और द्वारा लिखित एक जटिल सजावटी है। मैं जो करना चाहता हूं वह एक समय के आधार पर समारोह के सजाए गए संस्करण को कॉल करता है या किसी अन्य समय मूल फ़ंक्शन (सजाया नहीं जाता) पर कॉल करता है। क्या यह संभव है?कॉल से पहले पायथन सजावट कार्य
9
A
उत्तर
26
के साथ:
decorator(original_function)()
के बिना:
original_function()
एक डेकोरेटर सिर्फ एक समारोह जो एक तर्क के रूप में एक समारोह लेता है और एक और एक रिटर्न है। @ वाक्यविन्यास पूरी तरह से वैकल्पिक है। शायद documentation के माध्यम से एक चीज चीजों को स्पष्ट करने में मदद कर सकती है।
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)
संबंधित मुद्दे
- 1. पायथन: अपवाद सजावट। Stacktrace
- 2. पायथन सजावट और विधियां
- 3. पायथन: सजावट को कक्षा
- 4. पायथन कक्षा सजावट
- 5. पायथन सजावट हैंडलिंग डॉकस्ट्रिंग
- 6. पायथन कक्षा सजावट तर्क
- 7. पायथन सजावट 3.0 और सजावटी
- 8. विकल्प के साथ पायथन सजावट
- 9. पायथन सजावट, स्वयं मिश्रित है
- 10. नेस्टेड फ़ंक्शन सजावट जो पायथन
- 11. पायथन: कार्य
- 12. पायथन सजावट और कक्षा विरासत
- 13. जावा में पायथन जैसी सजावट?
- 14. @ फ़ंक्शन कॉल से पहले वर्ण
- 15. पायथन समारोह सजावट का परीक्षण कैसे करें?
- 16. सजावट
- 17. पहले कार्य अज्ञात
- 18. टाइपरर प्राप्त करना: 'मॉड्यूल' ऑब्जेक्ट सेलरी कार्य सजावट
- 19. पायथन कार्य वैश्विक चर?
- 20. "पायथन" टाइप किए बिना कमांड लाइन से एक पायथन स्क्रिप्ट को कॉल करना पहले
- 21. पायथन - कहीं सजावट की एक सूची है?
- 22. पायथन सजावट सिर्फ वाक्य रचनात्मक चीनी?
- 23. वर्ग या फ़ंक्शन के लिए पायथन सजावट
- 24. लॉगिंग सजावट
- 25. कॉल एक पहले से ही आबंटित स्मृति
- 26. एक पायथन लिपि से exiftool कॉल करें?
- 27. पायथन 2.6 में एक सशर्त सजावट कैसे करें 2.6
- 28. सी - पहले आरआरवी() कॉल
- 29. पायथन सीप्रोफाइल: प्रोफाइलिंग डेटा से विशिष्ट कॉल कैसे फ़िल्टर करें?
- 30. पायथन: कॉल तर्क
लिंक टूटा हुआ है :( –
लिंक ठीक है :) – chishaku