पायथन में स्कोप और नेमस्पेस के बीच क्या संबंध है?


12

कई संसाधनों में मैंने पाया "गुंजाइश" और "नेमस्पेस" का उपयोग एक-दूसरे से किया जाता है, जो अलग-अलग चीजों का मतलब होने के बाद से थोड़ा भ्रमित लगता है।

  • स्कोप कोड के क्षेत्र को परिभाषित करता है जहां एक नाम उपलब्ध है।
  • लेगबी नियम परिभाषित करता है जिस तरह से नामों को देखा जाता है।
  • नेमस्पेस एक ऐसी जगह है जहाँ आप नामों को देखते हैं।

फिर मैंने पढ़ा:

  • "नाम एक नेमस्पेस से बंधे हैं, जहां उन्हें सौंपा गया है ..." (जो मेरा मानना ​​है कि लेक्सिकल स्कोपिंग में स्कोप्स के साथ सौदा है)।
  • "फ़ंक्शंस आपके कार्यक्रमों में एक अतिरिक्त नेमस्पेस लेयर जोड़ते हैं" [ रेफ। ] (क्या वे एक अतिरिक्त स्थानीय गुंजाइश नहीं जोड़ते हैं?)
  • "फंक्शन डेफिनिशन के अंदर सौंपे गए सभी नामों को लोकल स्कोप (फंक्शन कॉल से जुड़े नेमस्पेस) में डाल दिया जाता है।"
  • "ग्लोबल स्कोप- यानी, एक नेमस्पेस जिसमें मॉड्यूल फ़ाइल के शीर्ष स्तर पर बनाए गए (असाइन किए गए) रहते हैं।"

* उद्धरणों के सभी अजगर 5 वें संस्करण ch17 सीखने से हैं

पायथन में नाम स्थान जिस तरह से स्कोप लागू किए गए हैं? क्या ये एक ही चीज हैं? क्या कोई मुझे बता सकता है?


1
क्या आप उद्धरणों के लिए संदर्भ प्रदान कर सकते हैं - मुझे एक मिल सकता है, लेकिन दूसरा नहीं।
जोंशरशेप

1
नाम स्थान केवल एक प्रकार की गुंजाइश है। देखें stackoverflow.com/questions/291978/...
रॉबर्ट हार्वे

जवाबों:


16

एक नामस्थान एक शब्दकोश है, मानचित्रण नाम (स्ट्रिंग के रूप में) मूल्यों के लिए। जब आप एक असाइनमेंट करते हैं, जैसे a = 1, आप एक नाम स्थान को बदल रहे हैं। जब आप एक संदर्भ बनाते हैं, जैसे print(a), पायथन एक नाम की एक सूची के माध्यम से कोशिश करता है और एक कुंजी के रूप में नाम के साथ मिल जाता है।

एक स्कोप परिभाषित करता है कि कौन से नामस्थान को किस क्रम में और किस क्रम में देखा जाएगा। किसी भी संदर्भ का दायरा हमेशा स्थानीय नामस्थान में शुरू होता है, और जब तक यह मॉड्यूल के वैश्विक नाम स्थान तक नहीं पहुंचता है, तब तक बाहर निकलता है, builtins(नेमस्पेस जो पायथन के पूर्वनिर्धारित कार्यों और स्थिरांक, जैसे rangeऔर getattr) का संदर्भ देता है, जो पंक्ति का अंत है। ।

कल्पना कीजिए कि आपके पास एक फ़ंक्शन है inner, जिसका नाम वैश्विक फ़ंक्शन के नाम पर रखा गया है outer, और innerजिसमें नाम का संदर्भ है। पायथन पहले innerनामस्थान में दिखता है । यदि नाम नहीं है, तो पायथन outerनामस्थान में दिखता है । यदि वह विफल हो जाता है, तो पायथन मॉड्यूल के globalनाम स्थान की कोशिश करता है , तो builtinनाम स्थान, अंत में NameErrorयदि नाम नहीं मिला है तो फेंक देते हैं।

जब हम कहते हैं कि xकिसी फ़ंक्शन के नाम स्थान पर है, तो हमारा मतलब है कि यह फ़ंक्शन के भीतर स्थानीय स्तर पर परिभाषित है। जब हम कहते हैं कि xफ़ंक्शन के दायरे में है, तो हमारा मतलब xफ़ंक्शन के नेमस्पेस या किसी भी बाहरी नेमस्पेस में है जो फ़ंक्शन के नेमस्पेस के अंदर नेस्टेड है।

जब भी आप किसी फ़ंक्शन को परिभाषित करते हैं, तो आप एक नया नाम स्थान और एक नया क्षेत्र बनाते हैं। नाम स्थान नाम का नया, स्थानीय हैश है। गुंजाइश नए नामों के स्थान पर शुरू होने वाले नामस्थानों की निहित श्रृंखला है, फिर किसी भी बाहरी नाम स्थान (बाहरी स्कोप), वैश्विक नाम स्थान (वैश्विक गुंजाइश), और बिलिंस पर काम करती है।

शब्दों का इस्तेमाल लगभग एक-दूसरे से किया जा सकता है, लेकिन ऐसा इसलिए नहीं है क्योंकि उनका मतलब एक ही है; यह इसलिए है क्योंकि वे जो कुछ भी करते हैं उसमें बहुत कुछ ओवरलैप करते हैं।


3
"शब्दों का इस्तेमाल लगभग एक-दूसरे के लिए किया जा सकता है, लेकिन ऐसा इसलिए नहीं है क्योंकि उनका मतलब एक ही है; यह इसलिए है क्योंकि वे जो करते हैं उसमें बहुत कुछ ओवरलैप करते हैं।"
निकोस

2
यह उत्तर आत्मा में सही है, लेकिन विस्तार से गलत है। पायथन में कक्षाएं एक नया नामस्थान नहीं लाती हैं, यही कारण है कि वर्ग विशेषताओं को वर्ग नाम के साथ योग्य होना चाहिए और उदाहरण के नाम के साथ उदाहरण विशेषताओं को योग्य क्यों होना चाहिए। पायथन में आंतरिक से बाहरी तक नाम स्थान के स्तर स्थानीय, एनक्लोजिंग, ग्लोबल और बिल्ट-इन हैं। इनमें से किसी भी स्तर पर एक वर्ग को परिभाषित किया जा सकता है, लेकिन एक वर्ग के सदस्यों को हमेशा योग्य होना चाहिए।
रोब स्मॉलशायर

आप सही हे। कक्षाएं मेरे द्वारा कहे गए तरीके से काम नहीं करती हैं। मैं सोच रहा था कि वे एक फ़ंक्शन की तरह एक शाब्दिक गुंजाइश बनाते हैं, लेकिन वे नहीं करते हैं। यदि आपके पास समय है तो कृपया उत्तर को अपडेट करें, अन्यथा मैं इसे किसी बिंदु पर करूँगा। धन्यवाद।
कार्ल स्मिथ

1
+1 शानदार जवाब, आर्थिक रूप से इतनी सूक्ष्मता को कूटबद्ध करना। मुझे यह बहुत उपयोगी लगा, धन्यवाद!
साधक

1
"एक नाम स्थान नाम का एक हैश है, मूल्य जोड़े, एक पायथन शब्दकोश की तरह" - मुझे पूरा यकीन है कि नाम पायथन शब्दकोशों के रूप में संग्रहीत हैं । उदाहरण के लिए, आप ग्लोबल्स () को कॉल करके वैश्विक नाम स्थान को संपादित कर सकते हैं, जो आपको शब्दकोश को सीधे वस्तुओं और नामों को बांधने के लिए संशोधित करता है: उदाहरण के लिए ग्लोबल्स () [नाम] = "ऑब्जेक्ट"। महान जवाब अन्यथा।
इवान रोज़िका

4

यहां पायथन नामस्थानों पर एक उत्कृष्ट लेख है । स्कोप और नेमस्पेस के बीच संदर्भ के बारे में अपने प्रश्न का उत्तर देने के लिए संबंधित भाग को उद्धृत करने के लिए:

एक गुंजाइश एक कार्यक्रम के एक क्षेत्र को संदर्भित करता है जहां से एक उपसर्ग के बिना एक नाम स्थान तक पहुँचा जा सकता है।

उदाहरण के लिए, एक साधारण डाई-रोलिंग कार्यक्रम की कल्पना करें:

import random  # 'random' is in module namespace

def roll(sides=6):  # 'roll' is in module namespace, 'sides' is in roll's
    return random.randint(1, sides)  # both 'random' and 'sides' are in scope here

# but sides can't be accessed out here 

roll अपने स्वयं के नाम स्थान है , लेकिन मॉड्यूल के नाम स्थान में नाम भी गुंजाइश में हैं


@CarlSmith ध्यान दें कि प्रारंभिक पायथन प्रलेखन एक ही बात कहता है: "एक दायरा एक पायथन प्रोग्राम का एक पाठ क्षेत्र है जहां एक नाम स्थान सीधे पहुंच योग्य है।" प्रत्यक्ष रूप से सुलभ '' का अर्थ है कि नाम के लिए एक अयोग्य संदर्भ नाम खोजने का प्रयास करता है। नाम स्थान में। "
जोंशरशेप

@CarlSmith गैर-स्थानीय / संलग्न क्षेत्र के अतिरिक्त से अलग, क्या इतना बदल गया है? मुझे लगता है कि हम एक ही बात कह रहे हैं - एक नाम स्थान में नाम और मूल्य शामिल हैं, और गुंजाइश आपको बताती है कि कौन से नामस्थान सुलभ हैं।
जोंशरशीप

मैंने अपनी पुरानी टिप्पणियों को हटा दिया।
कार्ल स्मिथ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.