मैं अजगर में एक नौसिखिया हूँ और मैं अजगर में समारोह सज्जाकार के चारों ओर अपना सिर लपेटने की कोशिश कर रहा हूँ। और मैं यह नहीं समझ सकता कि कार्य कैसे कार्य करता है।

मेरा मतलब है कि दुभाषिया किस क्रम में इस फ़ंक्शन की व्याख्या करता है:

def decorator(another_func):
    def wrapper():
        print('before actual function')
        return another_func()
    print('pos')
    return wrapper

और इन 2 कथनों में क्या अंतर है:-

return wrapper

तथा

return wrapper()

मैं हेड फर्स्ट पायथन का उपयोग कर रहा हूं, लेकिन मुझे लगता है कि इस विषय को वहां बहुत अच्छी तरह से वर्णित नहीं किया गया है, कृपया कोई वीडियो या एक अच्छा संसाधन सुझाएं ताकि मैं इसे समझ सकूं।

1
Poseidon Broger 1 अप्रैल 2020, 17:46

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 ऑब्जेक्ट और कुछ अन्य चीजों (तर्क सूची आदि) से एक फ़ंक्शन ऑब्जेक्ट (प्रकार 'फ़ंक्शन' का उदाहरण) बनाता है, और अंत में इसे बांधता है घोषित नाम पर फ़ंक्शन ऑब्जेक्ट (nb: 'बाइंड' => "असाइन करता है")।

आंतरिक def स्टेटमेंट वास्तव में केवल तभी निष्पादित होता है जब बाहरी फ़ंक्शन को कॉल किया जाता है, और इसे हर बार बाहरी फ़ंक्शन को कॉल करने पर नए सिरे से निष्पादित किया जाता है - IOW, decorator पर प्रत्येक कॉल एक नया फ़ंक्शन इंस्टेंस देता है।

उपरोक्त स्पष्टीकरण निश्चित रूप से काफी सरल है (इसलिए आंशिक रूप से अचूक), लेकिन यह मूल सिद्धांत को समझने के लिए पर्याप्त है।

2
bruno desthuilliers 1 अप्रैल 2020, 18:36

अंतर को समझने की कुंजी यह समझ रही है कि सब कुछ फ़ंक्शन सहित अजगर में एक वस्तु है। जब आप बिना कोष्ठक (return wrapper) के फ़ंक्शन के नाम का उपयोग करते हैं, तो आप वास्तविक फ़ंक्शन को ही वापस कर रहे हैं। जब आप कोष्ठक का उपयोग करते हैं, तो आप फ़ंक्शन को कॉल कर रहे होते हैं। निम्नलिखित उदाहरण कोड पर एक नज़र डालें:

def foo(arg):
    return 2

bar = foo
baz = foo()
qux = bar()
bar()

यदि आप baz या qux प्रिंट करते हैं, तो यह दो प्रिंट करेगा। यदि आप bar प्रिंट करते हैं, तो यह आपको फ़ंक्शन को संदर्भित करने के लिए स्मृति पता देगा, संख्या नहीं। लेकिन, यदि आप फ़ंक्शन को कॉल करते हैं, तो अब आप थ के परिणामों को प्रिंट कर रहे हैं

3
LTheriault 1 अप्रैल 2020, 17:57