में सजावटी पुनरावर्ती कार्य मुझे समझने में कठिनाई हो रही है कि एक सजाया गया रिकर्सिव फ़ंक्शन कैसे काम करता है। निम्नलिखित स्निपेट के लिए:पाइथन
def dec(f):
def wrapper(*argv):
print(argv, 'Decorated!')
return(f(*argv))
return(wrapper)
def f(n):
print(n, 'Original!')
if n == 1: return(1)
else: return(f(n - 1) + n)
print(f(5))
print
dec_f = dec(f)
print(dec_f(5))
print
f = dec(f)
print(f(5))
उत्पादन होता है:
(5, 'Original!')
(4, 'Original!')
(3, 'Original!')
(2, 'Original!')
(1, 'Original!')
15
((5,), 'Decorated!')
(5, 'Original!')
(4, 'Original!')
(3, 'Original!')
(2, 'Original!')
(1, 'Original!')
15
((5,), 'Decorated!')
(5, 'Original!')
((4,), 'Decorated!')
(4, 'Original!')
((3,), 'Decorated!')
(3, 'Original!')
((2,), 'Decorated!')
(2, 'Original!')
((1,), 'Decorated!')
(1, 'Original!')
15
पहले एक प्रिंट च (एन) इसलिए स्वाभाविक रूप से यह प्रिंट 'मूल' हर बार च (एन) रिकर्सिवली कहा जाता है।
दूसरा प्रिंट def_f (n) प्रिंट करता है, इसलिए जब एन को रैपर में पास किया जाता है तो यह f (n) को पुनरावर्ती रूप से कॉल करता है। लेकिन रैपर स्वयं रिकर्सिव नहीं है इसलिए केवल एक 'सजाया' मुद्रित किया जाता है।
तीसरा एक पहेली मुझे, जो सजावटी @ डीईसी का उपयोग करने जैसा ही है। सजाए गए एफ (एन) रैपर को पांच बार क्यों कहते हैं? मुझे लगता है कि def_f = dec (f) और f = dec (f) केवल दो कीवर्ड दो समान फ़ंक्शन ऑब्जेक्ट्स से बंधे हैं। क्या कुछ और चल रहा है जब सजाए गए फ़ंक्शन को अनावृत के समान नाम दिया जाता है?
धन्यवाद!
मूल 'f' समारोह के संदर्भ में अभी भी मौजूद है अंदर आवरण अंदर
func.__name__
औरf.__name__
मुद्रण, इस प्रकार है कि एक कहा जाता है से देख सकते हैं। जब आप 'f = dec (f)' करते हैं, तो आप हमेशा नया फ़ंक्शन कॉल करेंगे। और नया फ़ंक्शन मूल को कॉल करेगा। – JBernardo'सजावटी 'यहां उपयोग करने का सही शब्द नहीं हो सकता है, क्योंकि आप वास्तव में फ़ंक्शन में सजावट लागू नहीं करते हैं। 'F = dec (f)' का आपका अंतिम परीक्षण लगभग (अगर नहीं है) '@dec def f' –