पायथन में, cell
ऑब्जेक्ट्स closure के free variables को स्टोर करने के लिए उपयोग किए जाते हैं।
मान लें कि आप एक ऐसा फ़ंक्शन चाहते हैं जो हमेशा इसके तर्क का एक विशेष अंश देता है। यहाँ
def multiplier(n, d):
"""Return a function that multiplies its argument by n/d."""
def multiply(x):
"""Multiply x by n/d."""
return x * n/d
return multiply
और कैसे आप इसका इस्तेमाल कर सकते हैं:: आप इस लक्ष्य को हासिल करने के लिए एक बंद का उपयोग कर सकते
>>> two_thirds = multiplier(2, 3)
>>> two_thirds(7)
4.666666666666667
कैसे two_thirds
n
और d
के मूल्यों को याद करता है? वे multiply
फ़ंक्शन के तर्क नहीं हैं जो multiplier
परिभाषित हैं, वे के अंदर परिभाषित स्थानीय चर नहीं हैं, वे ग्लोबल्स नहीं हैं, और multiplier
पहले ही समाप्त हो चुका है, इसके स्थानीय चर मौजूद नहीं हैं, है ना? ,
>>> multiplier.__code__.co_cellvars
('d', 'n')
फिर जब multiplier
कहा जाता है:
क्या होता है जब multiplier
संकलित किया गया है, दुभाषिया देखती है कि कि multiply
बाद में अपने स्थानीय चर का उपयोग करना चाहते करने जा रहा है, तो यह उनमें से एक नोट रहता है उन बाहरी स्थानीय चर का मान दिया समारोह के __closure__
विशेषता में संग्रहीत किया जाता है, cell
वस्तुओं की एक टपल के रूप में:
>>> two_thirds.__closure__
(<cell at 0x7f7a81282678: int object at 0x88ef60>,
<cell at 0x7f7a81282738: int object at 0x88ef40>)
... उनके नाम के साथ में __code__
वस्तु के रूप में co_freevars
: आप अपने cell_contents
विशेषता का उपयोग कोशिकाओं की सामग्री को प्राप्त कर सकते हैं
>>> two_thirds.__code__.co_freevars
('d', 'n')
:
>>> {v: c.cell_contents for v, c in zip(
two_thirds.__code__.co_freevars,
two_thirds.__closure__
)}
{'d': 3, 'n': 2}
आप बंद और अजगर संवर्धन प्रस्ताव में उनके क्रियान्वयन के बारे में अधिक पढ़ सकते हैं जो उन्हें पेश किया: PEP 227 — Statically Nested Scopes।
जंग में, 'सेल' विरासत में अपरिवर्तनीयता प्राप्त करने का एक तरीका है ताकि आप इसके लिए एक अपरिवर्तनीय संदर्भ होने के बावजूद डेटा संशोधित कर सकें। पाइथन का अर्थ यह है कि यह एक अलग बात है। "सेल" एक सुंदर सामान्य शब्द है, आप जानते हैं। –
@ChrisMorgan लगता है जैसे आप संदर्भित दोनों संदर्भों में सेल से परिचित हैं। क्या आप उत्तर सबमिट करने के इच्छुक होंगे? –
मैं पाइथन कोड ऑब्जेक्ट प्रस्तुति के आंतरिक से वास्तव में परिचित नहीं हूं, लेकिन मैं अनुमान लगा सकता हूं कि इसका अर्थ "सेल" से क्या है। –