2011-03-28 15 views
9

में पाइथन nonlocal कथन मैं पाइथन 3 स्रोत कोड में दायरे के कुछ विश्लेषण करने की कोशिश कर रहा हूं और मैं कक्षा परिभाषा के अंदर nonlocal कथन कथन कैसे काम करता है के साथ अटक गया हूँ।कक्षा परिभाषा

जैसा कि मैं इसे समझता हूं, कक्षा परिभाषा अपने शरीर को एक नए नामस्थान के अंदर निष्पादित करती है (इसे कॉल करें) और कक्षा के नाम को प्रकार (नाम, आधार, dict) के परिणामस्वरूप बांधती है। Nonlocal एक्स तब तक काम करना चाहिए जब तक यह एक चर को संदर्भित करता है जो संलग्न गैर-स्थानीय दायरे में कहीं भी बंधे हैं।

इस से मैं संकलन और चलाने के लिए निम्न कोड की उम्मीद:

class A: 
    v = 1 
    class B: 
     nonlocal v 
     v = 2 

लेकिन इस

SyntaxError: no binding for nonlocal 'v' found 

के साथ विफल करते हुए निम्न कोड पूरी तरह से चलाता है

def A(): 
    v = 1 
    class B: 
     nonlocal v 
     v = 2 

किसी को भी व्याख्या कर सकते हैं फ़ंक्शन परिभाषा और कक्षा परिभाषा को बंद करने के बीच यहां अंतर?

+0

अधिक शोध - अंतिम कोड नमूने में, स्थानीय में (स्थानीय)() में {v: 1} है, जबकि बी के अंदर यह है {v: 2, ''__module__'': '' __main__'', ''__locals__'': {...}} – Andyrooger

उत्तर

10

लेक्सिकल स्कोपिंग केवल फ़ंक्शन नेमस्पेस पर लागू होता है, अन्यथा कक्षा के अंदर परिभाषित विधियां कक्षा स्तर विशेषताओं को देखने में सक्षम होंगी (जो डिज़ाइन द्वारा है - उन विशेषताओं को विधि के अंदर self के गुणों के रूप में एक्सेस किया जाना चाहिए)।

विधियों से संदर्भों के अनुसार वर्ग स्तर चर को छोड़ने के लिए समान सीमाएं nonlocal कीवर्ड को अपने जादू से काम करने से रोकती हैं। (global हालांकि काम करता है, क्योंकि यह लेक्सिकल स्कोपिंग मशीनरी पर निर्भर नहीं है)

+0

धन्यवाद, यह समझ में आता है। मैंने माना था कि स्टैक का कुछ बहुत ही बुनियादी रूप था जो हर स्तर के लिए समान काम करेगा। Symtable मॉड्यूल दस्तावेज़ों को ध्यान में रखते हुए मेरे दिमाग में बदलाव आया लेकिन मुझे वास्तव में समझ में नहीं आया कि क्या हो रहा था या आपका उत्तर क्यों नहीं। – Andyrooger

4

पायथन कक्षा और फ़ंक्शन परिभाषाओं को अलग-अलग संभालता है। उदाहरण के लिए, आपका A.v ए का चर नहीं है बल्कि इसकी विशेषता है। एक वर्ग द्वारा बनाई गई नामस्थान, इसलिए, एक गुंजाइश नहीं है। मुझे आश्चर्य नहीं है कि nonlocal काम नहीं करता है क्योंकि आप इसका उपयोग करने की कोशिश कर रहे हैं।

+0

उत्तर के लिए धन्यवाद। तो फ़ंक्शन स्कोप तब बनाया जाता है जब इसे परिभाषित किया जाता है। जैसा कि कक्षा परिभाषा का शरीर है, मुझे लगता है कि, एक अलग नामस्थान में तुरंत निष्पादित किया गया है, क्या यह इस निष्पादन की अवधि के लिए एक गुंजाइश नहीं बनाता है? - मुझे आश्चर्य है कि यह एक ही कारण से हो रहा है यदि एक आंतरिक वर्ग बाहरी वर्ग के गुणों तक नहीं पहुंच सकता है ... – Andyrooger

+0

यह एक अस्थायी गुंजाइश बनाता है, लेकिन यह एक अलग * प्रकार का दायरा है। संकलक यह निर्धारित करने में विभिन्न नियमों का उपयोग करता है कि कौन से गुण दिखाई दे रहे हैं (दोनों आंतरिक क्षेत्रों से संदर्भ के लिए और बाहरी क्षेत्रों में लिखित के लिए)। – ncoghlan

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