কম্পিউটার টিউটোরিয়াল

পাইথনে অ্যাবসোলিউট এবং রিলেটিভ ইমপোর্ট


অনেক সময় পাইথন কোড লিখার সময় আমরা দেখি অন্য পাইথন ফাইল বা প্যাকেজ থেকে কোড অ্যাক্সেস করার প্রয়োজন পড়ে। তখন আপনাকে ওই পাইথন ফাইল বা প্যাকেজটি বর্তমান কোডে ইমপোর্ট করতে হয়। সবচোয়ে সরল উপায় হলো বর্তমান পাইথন প্রোগ্রামের শীর্ষে নিচের স্টেটমেন্ট লিখা:

import package_name or module_name
or
from package_name import module_name/object_name

উপরোক্ত স্টেটমেন্ট পার্স হলে ইন্টারপ্রেটার নিচের কাজগুলো করে:

  • ইন্টারপ্রেটার পূর্বে ইমপোর্ট করা সব মডিউলের ক্যাশে (cache) এ নাম খুঁজে বের করে। এই ক্যাশ মডিউলের নাম sys.modules।

  • যদি সেখানে না পায়, তবে বিল্ট-ইন মডিউলদের লিস্টে খোঁজায়। এগুলো পাইথন স্ট্যান্ডার্ড লাইব্রেরির অংশ।

  • যদি সেটাও না পায়, তবে sys.path-এ ডিফাইন করা ডিরেক্টরির লিস্টে প্যাকেজ/মডিউল খোঁজায় যার প্রথম ডিরেক্টরি করেন্ট ডিরেক্টরি।

  • উপরের যেকোনো স্টেপে পাওয়া গেলে, প্যাকেজ/মডিউলের নাম বর্তমান প্রোগ্রামের লোকাল স্কোপে বাউন্ড হয়।

  • যদি কখনো পাওয়া না যায়, তবে ModuleNotFoundError উত্থাপন করা হয়।

ইমপোর্ট সম্পর্কে কিছু নিয়ম:

ইমপোর্ট স্টেটমেন্ট ফাইলের শীর্ষে লিখতে হয়। ইমপোর্টের অর্ডার নিচের মত হয়:

  • পাইথনের স্ট্যান্ডার্ড লাইব্রেরি মডিউল

  • থার্ড-পার্টি মডিউল থেকে ইমপোর্ট

  • লোকাল অ্যাপ্লিকেশন থেকে ইমপোর্ট

অ্যাবসোলিউট ইমপোর্ট (Absolute Import)

এই টাইপের ইমপোর্টে আমরা প্যাকেজ/মডিউল/ফাংশনের পূর্ণ পাথ নির্দিষ্ট করি। ডিরেক্টরি স্ট্রাকচারে স্ল্যাশ (/) এর বদলে ডট (.) ব্যবহার করা হয়।

নিচের ডিরেক্টরি স্ট্রাকচার বিবেচনা করুন:

python_project_name/packageA/moduleA1.py
python_project_name/packageA/moduleA2.py

মান लीজিয়ে moduleA2-এ myfunc নামে একটি ফাংশন রয়েছে। আমাদের বর্তমান প্রোগ্রামে সেটি ইমপোর্ট করতে হলে অ্যাবসোলিউট পাথ দিয়ে ইমপোর্ট স্টেটমেন্ট হবে:

from packageA.moduleA2 import myfunc

অ্যাবসোলিউট ইমপোর্টের বড় সুবিধা হলো এটি স্পষ্টভাবে ইন্ডিকেট করে ইমপোর্ট কোথা থেকে হচ্ছে, কিন্তু কখনো কখনো এটি খুব লম্বা হয়ে যায়।

রিলেটিভ ইমপোর্ট (Relative Import)

রিলেটিভ ইমপোর্টে আমরা ইমপোর্ট কिये যাওয়া প্যাকেজের পাথ বর্তমান স্ক্রিপ্টের লোকেশন کے সাপেক্ষে (relative) উল্লেখ করি।

একটি ডট (.) বর্তমান লোকেশন থেকে এক ডিরেক্টরি উপরে বোঝায়, দুটি ডট (..) বোঝায় দুটি ডিরেক্টরি উপরে, ইত্যাদি।

ডিরেক্টরি স্ট্রাকচার বিবেচনা করুন:

python_project_name/packageA/moduleA1.py
python_project_name/packageB/moduleB1.py

মান लीজিয়ে উপরের প্যাকেজ স্ট্রাকচার অনুযায়ী moduleB1-কে moduleA1 ইমপোর্ট করতে হবে। তাহলে ইমপোর্ট স্টেটমেন্ট হবে:

from ..packageA import moduleA1

দুটো ডট বোঝাচ্ছে moduleB1-এর লোকেশন থেকে python_project_name ডিরেক্টরিতে যেতে হবে এবং তারপর packageA-এ যেতে হবে moduleA1 পাওয়ার জন্য।

এই ধরনের ইমপোর্ট ছোট হয় এবং টপ-লেভেল প্রজেক্ট এক লোকেশন থেকে অন্যে সরালে ইমপোর্ট পাথ সহজে পরিবর্তন করা যায়। অন্যদিকে, ইমপোর্ট ফোল্ডার শেয়ার করা থাকলে পাথ মডিফিকেশন হলে কোড সহজে প্রভাবিত হয়।

  1. CSS আপসোলিউট (Absolute) ও রিলেটিভ (Relative) লেথ ইউনিট বোঝা

  2. CSS Absolute এবং Relative Units

  3. পাইথন প্যান্ডাসে Group-by এবং Sum অপারেশন

  4. Python-এ Matplotlib ইম্পোর্ট ও ইনস্টল করার পদ্ধতি