2010-10-12 14 views
31

क्या मैंने अभी पाइथन & सीखना शुरू कर दिया है "नामस्थान" पायथन में अवधारणा में आया है। जबकि मुझे यह पता चला कि यह क्या है, लेकिन इस अवधारणा की गुरुत्वाकर्षण की सराहना करने में असमर्थ हूं।पाइथन नामस्थानों के बारे में

नेट पर कुछ ब्राउज़िंग से पता चला कि PHP के खिलाफ जाने के कारणों में से एक यह है कि इसका नामस्थानों के लिए कोई मूल समर्थन नहीं है।

कोई कैसे नामस्थान & उपयोग करने के लिए इस सुविधा प्रोग्रामिंग बेहतर बनाता समझा सकते हैं (न केवल पायथन में, मैं किसी विशेष भाषा के लिए सीमित नहीं एक अवधारणा में नामस्थान मान के रूप में)।

मैं मुख्य रूप से जावा और सी प्रोग्रामिंग पृष्ठभूमि से आ रहा हूं।

+2

कुछ अन्य PHP व्यक्ति को कुछ घंटों पहले नामस्थानों में समस्याएं आ रही थीं: http://stackoverflow.com/questions/3909002/ शायद पढ़ने के लायक हो। –

उत्तर

36

नामस्थान स्कोप को लागू करने का एक तरीका है।

जावा (या सी) में संकलक निर्धारित करता है कि स्थैतिक स्कोप विश्लेषण के माध्यम से एक चर दिखाई देता है।

  • सी में, दायरा या तो एक समारोह का शरीर है या यह वैश्विक है या यह बाहरी है। कंपाइलर आपके लिए यह कारण बताता है और स्कोप नियमों के आधार पर प्रत्येक परिवर्तनीय नाम को हल करता है। सभी मॉड्यूल संकलित किए जाने के बाद लिंकर द्वारा बाहरी नाम हल किए जाते हैं।

  • जावा में, दायरा एक विधि समारोह, या कक्षा के सभी तरीकों का शरीर है। कुछ वर्ग नामों में मॉड्यूल-स्तरीय दायरा भी होता है। फिर, कंपाइलर संकलन समय पर इसका आंकड़ा करता है और स्कोप नियमों के आधार पर प्रत्येक नाम को हल करता है।

पायथन में, प्रत्येक पैकेज, मॉड्यूल, कक्षा, फ़ंक्शन और विधि फ़ंक्शन में "नेमस्पेस" होता है जिसमें परिवर्तनीय नाम हल किए जाते हैं। इसके अलावा एक वैश्विक नेमस्पेस है जिसका उपयोग स्थानीय नामस्थान में नहीं है।

प्रत्येक वैरिएबल नाम स्थानीय नेमस्पेस (फ़ंक्शन का बॉडी, मॉड्यूल इत्यादि) में चेक किया गया है, और उसके बाद वैश्विक नेमस्पेस में चेक किया गया है।

चर आमतौर पर केवल स्थानीय नामस्थान में बनाए जाते हैं। global और nonlocal कथन स्थानीय नामस्थान के अलावा अन्य चर बना सकते हैं।

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

+1

नामस्थान एक दायरे के अंदर नाम प्रबंधन को लागू करने का एक तरीका है, क्योंकि एक दायरा नाम प्रबंधन से अधिक है। मेरा जवाब देखें – alinsoar

3

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

संदर्भ: http://bytebaker.com/2008/07/30/python-namespaces/

5

नेमस्पेस कक्षाएं, तरीकों और एक ही नाम है कि हो सकता है विभिन्न लोगों द्वारा लिखा गया है के साथ वस्तुओं के बीच संघर्ष को रोकने के।

जावा पृष्ठभूमि से आने से आप शायद परिचित हैं कि यह संकुल का उपयोग करके कैसे प्राप्त किया जाता है। आप movieyoda.DateUtils कक्षा बना सकते हैं और मैं mikej.DateUtils कक्षा बना सकता हूं और पैकेज कक्षाओं का उपयोग करके कोड को उनके बीच अंतर करने की अनुमति देता है। (पायथन में something very similar है।)

नामस्थान को 5.3.0 में PHP में जोड़ा गया था लेकिन पिछले संस्करणों में (और अन्य भाषाओं में जो नामस्थान प्रदान नहीं करते हैं) आपको अपनी कक्षा और विधि नामों को कुछ कम करने के लिए उपसर्ग करना होगा एक नाम संघर्ष का जोखिम। जैसे एक movieyoda_parse_file फ़ंक्शन।

0

यदि आप किसी और के साथ बड़ा कार्यक्रम करते हैं, तो आप प्रोग्राम के अपने हिस्से को लिख सकते हैं जैसा आप चाहते हैं। फ़ाइल में सभी चर निजी होंगे, कोई टकराव नहीं होगा। जब आप PHP प्रोग्राम लिखते हैं, तो गलती से वैश्विक चर को फिर से लिखना आसान होता है। यदि आप चाहते हैं तो पाइथन में आप अन्य मॉड्यूल चर आयात कर सकते हैं, और वे आपके मॉड्यूल पर "वैश्विक" होंगे।

आप पाइथन में एक फ़ाइल एक ऑब्जेक्ट सोच सकते हैं। जब आप PHP प्रोग्राम लिखते हैं तो आप आवृत्ति चर के साथ कक्षाएं लिखकर इसे प्राप्त कर सकते हैं।

0

मैं एसएलॉट का उत्तर पूरा करता हूं।

मैं कहूंगा, नामस्थान एक दायरे के अंदर नाम प्रबंधन को लागू करने का एक तरीका है, क्योंकि एक दायरा नाम प्रबंधन से अधिक है।

सी में स्कॉप्स 4 प्रकार के होते हैं: वैश्विक, फ़ंक्शन, ब्लॉक और फ़ंक्शन-पैरामीटर (प्रोटोटाइप)। जरूरतों के आधार पर इनमें से प्रत्येक प्रकार एक या अधिक नामस्थान बना सकता है। सी में 4 एनएस हैं- एस/यू/ई के लिए टैग - टाइपनाम, फ़ंक्शन नाम और var नामों के लिए आईडी - फ़ंक्शन प्रोटोटाइप के अंदर पैरामीटर - एस/यू के अंदर सदस्य और बिटफील्ड।

इसी तरह, टैग पहचानकर्ता और फ़ंक्शन नाम टकराव नहीं करते हैं, लेकिन टाइपपीफ द्वारा परिभाषित टाइपनाम नाम परिवर्तनीय नामों के साथ टकरा सकते हैं।

पायथन में एक अंतर्निहित नामस्थान है जो वैश्विक एनएस संलग्न करता है, और वैश्विक एनएस लोड मॉड्यूल द्वारा प्रदान किया जाता है। बिल्टिन एनएस चर शामिल हैं। एक चर के लिए एक प्रतीक किसी ऑब्जेक्ट या फ़ंक्शन को परिभाषित कर सकता है - उदाहरण के लिए, + को परिभाषित किया गया है। मॉड्यूल का वैश्विक एन समाप्ति तक रहता है।

that और निश्चित रूप से that देखें।

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