2014-05-20 9 views
5

पायथन कोड ऑब्जेक्ट्स में एक विशेषता co_cellvars है। PyPy's bytecode interpreter पर प्रलेखन अक्सर सेल शब्द का उपयोग करता है।एक दुभाषिया या कंपाइलर के संदर्भ में एक सेल क्या है?

अन्य लैंगुग्स के बीच, जंग provides a Cell datatype। गुगलिंग से पता चलता है कि वे किसी भी तरह से बंद होने से संबंधित हैं।

प्रोग्रामिंग भाषा कार्यान्वयन के संदर्भ में सेल क्या है? कोशिकाओं को हल करने में क्या समस्या है?

+1

जंग में, 'सेल' विरासत में अपरिवर्तनीयता प्राप्त करने का एक तरीका है ताकि आप इसके लिए एक अपरिवर्तनीय संदर्भ होने के बावजूद डेटा संशोधित कर सकें। पाइथन का अर्थ यह है कि यह एक अलग बात है। "सेल" एक सुंदर सामान्य शब्द है, आप जानते हैं। –

+0

@ChrisMorgan लगता है जैसे आप संदर्भित दोनों संदर्भों में सेल से परिचित हैं। क्या आप उत्तर सबमिट करने के इच्छुक होंगे? –

+0

मैं पाइथन कोड ऑब्जेक्ट प्रस्तुति के आंतरिक से वास्तव में परिचित नहीं हूं, लेकिन मैं अनुमान लगा सकता हूं कि इसका अर्थ "सेल" से क्या है। –

उत्तर

9

पायथन में, 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_thirdsn और 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

संबंधित मुद्दे