এই প্রশ্নের সাথে অসুবিধার একটি উত্স হ'ল আপনার নামক একটি প্রোগ্রাম রয়েছে 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
)।