मैं अजगर में एक नौसिखिया हूँ और मैं अजगर में समारोह सज्जाकार के चारों ओर अपना सिर लपेटने की कोशिश कर रहा हूँ। और मैं यह नहीं समझ सकता कि कार्य कैसे कार्य करता है।
मेरा मतलब है कि दुभाषिया किस क्रम में इस फ़ंक्शन की व्याख्या करता है:
def decorator(another_func):
def wrapper():
print('before actual function')
return another_func()
print('pos')
return wrapper
और इन 2 कथनों में क्या अंतर है:-
return wrapper
तथा
return wrapper()
मैं हेड फर्स्ट पायथन का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि इस विषय को वहां बहुत अच्छी तरह से वर्णित नहीं किया गया है, कृपया कोई वीडियो या एक अच्छा संसाधन सुझाएं ताकि मैं इसे समझ सकूं।
2 जवाब
मैं यह नहीं समझ सकता कि फ़ंक्शन कैसे कार्य करता है।
जैसा कि LTheriault द्वारा पहले ही समझाया गया है, अजगर में सब कुछ एक वस्तु है। इतना ही नहीं, बल्कि रनटाइम पर भी सब कुछ होता है - def
स्टेटमेंट एक एक्जीक्यूटेबल स्टेटमेंट है, जो def
ब्लॉक के भीतर कोड से एक function
ऑब्जेक्ट बनाता है और इस ऑब्जेक्ट को फंक्शन के साथ बाइंड करता है। वर्तमान नामस्थान में नाम - IOW यह कुछ परिचालनों के लिए अधिकतर वाक्य रचनात्मक चीनी है जिसे आप मैन्युअल रूप से कोड कर सकते हैं (हालांकि एक बहुत ही स्वागत वाक्य रचनात्मक चीनी - "हाथ से" फ़ंक्शन ऑब्जेक्ट बनाना काफी काम है)।
ध्यान दें कि "प्रथम श्रेणी के नागरिक" के रूप में कार्य करना पायथन विशिष्ट नहीं है - यह कार्यात्मक प्रोग्रामिंगका आधार है। ए>।
मेरा मतलब है कि दुभाषिया किस क्रम में इस फ़ंक्शन की व्याख्या करता है:
def decorator(another_func):
def wrapper():
print('before actual function')
return another_func()
print('pos')
return wrapper
मान लें कि डेकोरेटर
फ़ंक्शन को मॉड्यूल के शीर्ष-स्तर पर घोषित किया गया है: रनटाइम पहले कोड ब्लॉक लेता है जो def
स्टेटमेंट का अनुसरण करता है, इसे कोडकोड में संकलित करता है। code> ऑब्जेक्ट, इस
code
ऑब्जेक्ट और कुछ अन्य चीजों (तर्क सूची आदि) से एक फ़ंक्शन
ऑब्जेक्ट (प्रकार 'फ़ंक्शन' का उदाहरण) बनाता है, और अंत में इसे बांधता है घोषित नाम पर फ़ंक्शन ऑब्जेक्ट (nb: 'बाइंड' => "असाइन करता है")।
आंतरिक def
स्टेटमेंट वास्तव में केवल तभी निष्पादित होता है जब बाहरी फ़ंक्शन को कॉल किया जाता है, और इसे हर बार बाहरी फ़ंक्शन को कॉल करने पर नए सिरे से निष्पादित किया जाता है - IOW, decorator
पर प्रत्येक कॉल एक नया फ़ंक्शन इंस्टेंस देता है।
उपरोक्त स्पष्टीकरण निश्चित रूप से काफी सरल है (इसलिए आंशिक रूप से अचूक), लेकिन यह मूल सिद्धांत को समझने के लिए पर्याप्त है।
अंतर को समझने की कुंजी यह समझ रही है कि सब कुछ फ़ंक्शन सहित अजगर में एक वस्तु है। जब आप बिना कोष्ठक (return wrapper
) के फ़ंक्शन के नाम का उपयोग करते हैं, तो आप वास्तविक फ़ंक्शन को ही वापस कर रहे हैं। जब आप कोष्ठक का उपयोग करते हैं, तो आप फ़ंक्शन को कॉल कर रहे होते हैं। निम्नलिखित उदाहरण कोड पर एक नज़र डालें:
def foo(arg):
return 2
bar = foo
baz = foo()
qux = bar()
bar()
यदि आप baz या qux प्रिंट करते हैं, तो यह दो प्रिंट करेगा। यदि आप bar
प्रिंट करते हैं, तो यह आपको फ़ंक्शन को संदर्भित करने के लिए स्मृति पता देगा, संख्या नहीं। लेकिन, यदि आप फ़ंक्शन को कॉल करते हैं, तो अब आप थ के परिणामों को प्रिंट कर रहे हैं
संबंधित सवाल
नए सवाल
python
पायथन एक बहु-प्रतिमान है, गतिशील रूप से टाइप किया हुआ, बहुउद्देशीय प्रोग्रामिंग भाषा है। यह एक साफ और एक समान वाक्यविन्यास सीखने, समझने और उपयोग करने के लिए त्वरित होने के लिए डिज़ाइन किया गया है। कृपया ध्यान दें कि अजगर 2 आधिकारिक तौर पर 01-01-2020 के समर्थन से बाहर है। फिर भी, संस्करण-विशिष्ट पायथन सवालों के लिए, [अजगर -२.०] या [अजगर -३.x] टैग जोड़ें। पायथन वेरिएंट (जैसे, ज्योथन, PyPy) या लाइब्रेरी (उदा।, पांडस और न्यूमपी) का उपयोग करते समय, कृपया इसे टैग में शामिल करें।