इस सवाल के साथ कठिनाई का एक स्रोत है कि आप नाम के एक कार्यक्रम है 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:a
bar.py:a
None
from bar import a as a2
__init__.py
bar/bar.py:a
bar/__init__.py:a2
a
__init__.py
bar.a
a
अब, जब आप करते हैं
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.py
bar.__init__.py
bar/
import bar