निम्नलिखित दो स्क्रिप्ट बराबर क्यों नहीं हैं?क्यों पाइथन सजावट परिभाषाओं में बंधे नहीं जा सकते हैं?
def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
@makebold
@makeitalic
def hello():
return "hello world"
print hello() ## returns <b><i>hello world</i></b>
और एक सजाया डेकोरेटर के साथ:
def makebold(fn):
def wrapped():
return "<b>" + fn() + "</b>"
return wrapped
@makebold
def makeitalic(fn):
def wrapped():
return "<i>" + fn() + "</i>"
return wrapped
@makeitalic
def hello():
return "hello world"
print hello() ## TypeError: wrapped() takes no arguments (1 given)
मैं क्यों करना चाहते हैं पता करने के लिए:
(Understanding Python Decorators एक और सवाल से लिया)? मैंने MySQLdb अपवादों को पकड़ने के लिए retry
सजावट लिखा है - यदि अपवाद क्षणिक है (उदा। टाइमआउट) यह थोड़ा सा सोने के बाद फ़ंक्शन को फिर से कॉल करेगा।
मुझे modifies_db
सजावट भी मिली है जो कुछ कैश से संबंधित हाउसकीपिंग का ख्याल रखती है। modifies_db
retry
से सजाया गया है, इसलिए मुझे लगता है कि modifies_db
से सजाए गए सभी फ़ंक्शन भी पूरी तरह से पुनः प्रयास करेंगे। मुझसे कहां गलती हो गई?
अच्छा सवाल। कुछ महीने पहले मैं अपने खुद के पुनः प्रयास करने वाले सजावट करने के दौरान उसी परिदृश्य में भाग गया था। यह एक पुनः प्रयास गिनती ले लिया, इसलिए समस्या ने खुद को थोड़ा अलग प्रस्तुत किया, लेकिन नीचे जैसा देखा गया वही समाधान था। –