जैसा कि इस SO उत्तर A closure occurs when a function has access to a local variable from an enclosing scope that has finished its execution में बताया गया है। जैसा कि मैं समझता हूं कि एक फ़ंक्शन स्कोप समाप्त होने पर समाप्त हो जाता है। पाइथन क्लोजर पर कई किताबों में हमेशा नेस्टेड फ़ंक्शन को परिभाषित करने और बाहरी दायरे के अंत को इंगित करने के लिए इसे अंत में वापस करने के उदाहरण होते हैं। जैसे रामलहो द्वारा Fluent Python

def make_averager():
    series = []
    def averager(new_value):
        series.append(new_value)
        total = sum(series)
        return total/len(series)
    return averager

लुबानोविक द्वारा पुस्तक Introducing Python

def knights2(saying):
    def inner2():
        return "We are the knights who say: '%s'" % saying
    return inner2

फिर मुझे ब्रेट स्लैटकिन की किताब Effective Python मिलती है। बंद करने का उनका उदाहरण:

def sort_priority(values, group):
    def helper(x):
        if x in group:
            return (0, x)
        return (1, x)
    values.sort(key=helper)

numbers = [8, 3, 1, 2, 5, 4, 7, 6]
group = {2, 3, 5, 7}
sort_priority(numbers, group)

ब्रेट का कहना है कि क्लोजर helper फंक्शन में होता है। helper को values.sort(key=helper) के अंदर कॉल किया गया। जैसा कि मैं समझता हूं कि sort_priority का दायरा values.sort(key=helper) तक पहुंचने पर समाप्त नहीं हुआ है। वह यहां क्लोजर होने की बात क्यों कहते हैं?

मैं केवल ब्रेट के उदाहरण के समापन पहलू के बारे में सोचता हूं। मैं पहले से जानता/समझता हूं कि sort_priority और helper कैसे काम करते हैं

पियर्सन यहां किताब के सैंपल पेज मुहैया कराता है। सौभाग्य से, नमूना पृष्ठों में वह हिस्सा है जिसका मैंने उल्लेख किया है। यह Item 15: Know How Closures Interact with Variable Scope है

1
Andy L. 29 पद 2019, 00:52

1 उत्तर

सबसे बढ़िया उत्तर

जैसा कि मैं समझता हूं कि sort_priority का दायरा समाप्त नहीं हुआ है जब यह लाइन values.sort(key=helper) तक पहुंचता है। बंद क्यों कहते हैं यहाँ हो रहा है?

यह मानते हुए कि यह पूरी तरह से गलती नहीं है, स्लेटकिन को "क्लोजर" की एक अलग परिभाषा का उपयोग करना चाहिए। चूंकि प्रस्तुत कोड एक उदाहरण है, मुझे लगता है कि यह एक परिभाषा के साथ है, जिसे आपको अपने द्वारा उद्धृत के साथ सावधानीपूर्वक तुलना करनी चाहिए।

मुझे लगता है कि स्लैटकिन का विचार चारों ओर घूमता है helper() आसपास के संदर्भ के group चर तक पहुंचने में सक्षम होने पर इसे values.sort() द्वारा बुलाया जाता है, जहां वह चर दायरे में नहीं है। यह कम से कम एक क्लोजर की पारंपरिक परिभाषा के समान है - फ़ंक्शन इसके साथ इसकी परिभाषा के संदर्भ से संबंधित डेटा को संदर्भित करने की क्षमता रखता है। मुझे नहीं लगता कि मैं इस बात से सहमत हूं कि यह बंद करने के सामान्य मानदंडों को पूरी तरह से पूरा करता है, लेकिन उस तकनीक के सार से आपको विचलित न होने दें जिसे स्लैटकिन सिखाने की कोशिश कर रहा है।

1
John Bollinger 28 पद 2019, 22:17