टी एल; डॉ:
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.path
foo.bar
foo
foo.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__)
निहित नामस्थान पैकेजों को शामिल करने के लिए अद्यतन नहीं किया गया है।