टी एल; डॉ:
Python 3.3 पर आपको कुछ भी करने की ज़रूरत नहीं है, बस __init__.pyअपने नेमस्पेस पैकेज निर्देशिकाओं में किसी को न डालें और यह सिर्फ काम करेगा। प्री-3.3 pkgutil.extend_path()पर, pkg_resources.declare_namespace()एक पर समाधान चुनें , क्योंकि यह भविष्य के सबूत है और पहले से ही निहित नाम स्थान पैकेज के साथ संगत है।
पायथन 3.3 अंतर्निहित नाम स्थान पैकेज पेश करता है, पीईपी 420 देखें ।
इसका मतलब है कि अब तीन प्रकार की वस्तुएं बनाई जा सकती हैं import foo:
- एक
foo.pyफ़ाइल द्वारा प्रदर्शित मॉड्यूल
- एक नियमित पैकेज, एक निर्देशिका
fooजिसमें एक __init__.pyफ़ाइल होती है
- एक नेमस्पेस पैकेज, जो
fooकिसी भी __init__.pyफाइल के बिना एक या अधिक निर्देशिकाओं द्वारा दर्शाया गया है
पैकेज भी मॉड्यूल हैं, लेकिन यहां मेरा मतलब है "नॉन-पैकेज मॉड्यूल" जब मैं कहता हूं "मॉड्यूल"।
पहले यह sys.pathएक मॉड्यूल या नियमित पैकेज के लिए स्कैन करता है । यदि यह सफल होता है, तो यह मॉड्यूल या पैकेज को खोजना और बनाना और बंद कर देता है। यदि इसे कोई मॉड्यूल या नियमित पैकेज नहीं मिला, लेकिन इसे कम से कम एक निर्देशिका मिली, तो यह एक नाम स्थान पैकेज बनाता है और आरंभ करता है।
मॉड्यूल और नियमित पैकेजों __file__को उस .pyफ़ाइल पर सेट किया गया है जिसे उन्होंने बनाया था। नियमित और नेमस्पेस पैकेज ने __path__उन निर्देशिकाओं या निर्देशिकाओं के लिए सेट किया है, जिनसे वे बनाए गए थे।
जब आप करते हैं import foo.bar, तो उपरोक्त खोज पहले होती है foo, उसके बाद यदि कोई पैकेज मिलता है, तो खोज के बजाय खोज पथ के barसाथ किया जाता है । यदि पाया जाता है, और बनाया जाता है और आरंभिक होता है।foo.__path__sys.pathfoo.barfoofoo.bar
तो नियमित पैकेज और नेमस्पेस पैकेज कैसे मिलाते हैं? आम तौर पर वे नहीं करते हैं, लेकिन पुराने pkgutilस्पष्ट नामस्थान पैकेज पद्धति को निहित नाम स्थान पैकेज शामिल करने के लिए बढ़ाया गया है।
यदि आपके पास एक मौजूदा नियमित पैकेज है __init__.pyजो इस प्रकार है:
from pkgutil import extend_path
__path__ = extend_path(__path__, __name__)
... विरासत का व्यवहार किसी अन्य नियमित पैकेज को खोजे गए पथ पर जोड़ना है __path__। लेकिन पायथन 3.3 में, यह नेमस्पेस पैकेज भी जोड़ता है।
तो आपके पास निम्न निर्देशिका संरचना हो सकती है:
├── path1
│ └── package
│ ├── __init__.py
│ └── foo.py
├── path2
│ └── package
│ └── bar.py
└── path3
└── package
├── __init__.py
└── baz.py
... और जब तक दोनों __init__.pyकी extend_pathरेखाएँ हैं (और path1, path2और path3आपके हैं sys.path) import package.foo, import package.barऔर import package.bazसभी काम करेंगे।
pkg_resources.declare_namespace(__name__) निहित नामस्थान पैकेजों को शामिल करने के लिए अद्यतन नहीं किया गया है।