এই প্রশ্নের সাথে অসুবিধার একটি উত্স হ'ল আপনার নামক একটি প্রোগ্রাম রয়েছে bar/bar.py: import barআমদানি হয় হয় bar/__init__.pyবা হয় bar/bar.pyকোথায় হয় তার উপর নির্ভর করে যা aকোনটি ট্র্যাক করতে এটি একটু জটিল করে তোলে bar.a।
এটা যেভাবে কাজ করে:
কী ঘটেছিল তা বোঝার মূল চাবিকাঠিটি এটি আপনার উপলব্ধিতে অনুধাবন করা __init__.py,
from bar import a
বাস্তবে কিছু ভালো লাগে
a = bar.a
এবং একটি নতুন ভেরিয়েবল সংজ্ঞা দেয় ( 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()সংজ্ঞায়িত করা হয়, এটা একবার পরিবর্তনশীল নামের binds, তাই aমধ্যে bar.pyহয় bar.py:a, অন্য কোন না aপরিবর্তনশীল অন্য সংজ্ঞায়িত মডিউল হিসাবে অনেক হতে পারে aসকল আমদানি করা মডিউল ভেরিয়েবল )। অতএব শেষ Noneআউটপুট।
উপসংহার: এটা কোনো অস্পষ্টতা এড়ানোর ভাল import barদ্বারা না কোনো থাকার bar/bar.py(যেহেতু মডিউল bar.__init__.pyতোলে ডিরেক্টরির bar/একটি প্যাকেজ ইতিমধ্যে, তোমরাও তেমনি সঙ্গে আমদানি করতে পারেন import bar)।