पाइथन में, एक क्लोजर एक फ़ंक्शन का एक उदाहरण है जिसमें वैरिएबल हैं जो इसे अपरिवर्तनीय रूप से बाध्य करते हैं।
वास्तव में, डेटा मॉडल अपने कार्यों की __closure__
विशेषता के विवरण में यह बताता है :
कोई भी या कोशिकाओं का एक समूह जिसमें फ़ंक्शन के मुक्त चर के लिए बाइंडिंग होती है। सिफ़ पढ़िये
इसे प्रदर्शित करने के लिए:
def enclosure(foo):
def closure(bar):
print(foo, bar)
return closure
closure_instance = enclosure('foo')
स्पष्ट रूप से, हम जानते हैं कि अब हमारे पास चर नाम से इंगित एक फ़ंक्शन है closure_instance
। मूल रूप से, अगर हम इसे किसी ऑब्जेक्ट के साथ कहते हैं, तो bar
इसे स्ट्रिंग को प्रिंट करना चाहिए, 'foo'
और जो भी स्ट्रिंग का प्रतिनिधित्व bar
है।
वास्तव में, स्ट्रिंग 'foo' है समारोह के कहने के लिए बाध्य है, और हम सीधे उसे यहां पढ़ सकें तक पहुंच कर, cell_contents
पहली (और केवल) की टपल में सेल की विशेषता __closure__
विशेषता:
>>> closure_instance.__closure__[0].cell_contents
'foo'
एक तरफ के रूप में, सेल ऑब्जेक्ट्स को सी एपीआई प्रलेखन में वर्णित किया गया है:
"सेल" ऑब्जेक्ट का उपयोग कई स्कोप द्वारा संदर्भित चर को लागू करने के लिए किया जाता है
और हम अपने बंद करने के उपयोग को प्रदर्शित कर सकते हैं, यह देखते हुए कि 'foo'
फ़ंक्शन में अटक गया है और नहीं बदलता है:
>>> closure_instance('bar')
foo bar
>>> closure_instance('baz')
foo baz
>>> closure_instance('quux')
foo quux
और कुछ भी इसे बदल नहीं सकता है:
>>> closure_instance.__closure__ = None
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: readonly attribute
आंशिक कार्य
दिए गए उदाहरण एक आंशिक फ़ंक्शन के रूप में क्लोजर का उपयोग करता है, लेकिन अगर यह हमारा एकमात्र लक्ष्य है, तो उसी लक्ष्य को पूरा किया जा सकता है functools.partial
>>> from __future__ import print_function
>>> partial_function = functools.partial(print, 'foo')
>>> partial_function('bar')
foo bar
>>> partial_function('baz')
foo baz
>>> partial_function('quux')
foo quux
अधिक जटिल क्लोजर भी हैं जो आंशिक फ़ंक्शन उदाहरण के लिए फिट नहीं होंगे, और मैं उन्हें समय की अनुमति देता हूं।
nonlocal
अजगर 3 में जोड़ा गया था, अजगर 2.x में पूर्ण-पर, पढ़ने-लिखने के बंद नहीं थे (अर्थात आप चर पर बंद पढ़ सकते हैं, लेकिन उनके मूल्यों को नहीं बदल सकते हैं)