इस सवाल के साथ कठिनाई का एक स्रोत है कि आप नाम के एक कार्यक्रम है bar/bar.py: import barआयात या तो bar/__init__.pyया bar/bar.py, जहां यह किया जाता है, जो यह ट्रैक करने के लिए एक छोटे से बोझिल जो बनाता है के आधार पर aहै bar.a।
यहाँ दिया गया है कि यह कैसे काम करता है:
क्या होता है यह समझने की कुंजी यह महसूस करना है कि आप में __init__.py,
from bar import a
प्रभाव में कुछ ऐसा करता है
a = bar.a
# … where bar = bar/bar.py (as if bar were imported locally from __init__.py)
और एक नया चर परिभाषित करता है ( bar/__init__.py:aयदि आप चाहें तो)। इस प्रकार, आपका मूल नाम ( ) from bar import aमें __init__.pyबांधता है । यही कारण है कि आप कर सकते हैं में : इस मामले में, यह स्पष्ट है कि आप दोनों है और एक अलग चर नाम (आपके मामले में, दो चर के नाम सिर्फ दोनों होना करने के लिए होता है , लेकिन वे अभी भी अलग नामस्थान में रहते हैं: में , वे हैं और )।bar/__init__.py:abar.py:aNonefrom bar import a as a2__init__.pybar/bar.py:abar/__init__.py:a2a__init__.pybar.aa
अब, जब आप करते हैं
import bar
print bar.a
आप चर bar/__init__.py:a( import barअपने आयात के बाद से bar/__init__.py) तक पहुँच रहे हैं । यह वह चर है जिसे आप संशोधित करते हैं (1 से)। आप चर की सामग्री को नहीं छू रहे हैं bar/bar.py:a। तो जब आप बाद में करते हैं
bar.foobar()
आप कॉल करते हैं bar/bar.py:foobar(), जो चर aको एक्सेस करता है bar/bar.py, जो अभी भी है None(जब foobar()परिभाषित किया गया है, तो यह चर नामों को एक बार और सभी के लिए बांधता है, इसलिए यह aहै bar.pyकि bar.py:a, किसी अन्य aमॉड्यूल में परिभाषित कोई अन्य चर नहीं है - क्योंकि aसभी आयातित मॉड्यूल में कई चर हो सकते हैं )। इसलिए आखिरी Noneआउटपुट।
निष्कर्ष: किसी भी मॉड्यूल के न होने से import bar, किसी भी अस्पष्टता से बचने के लिए सबसे अच्छा है (क्योंकि निर्देशिका पहले से ही एक पैकेज बनाती है, जिसे आप आयात भी कर सकते हैं )।bar/bar.pybar.__init__.pybar/import bar