মডিউলগুলি (এবং প্যাকেজগুলি) আপনার প্রোগ্রামকে পৃথক নেমস্পেসে বিভক্ত করার একটি দুর্দান্ত পাইথোনিক উপায়, যা এই প্রশ্নের অন্তর্নিহিত লক্ষ্য বলে মনে হয়। প্রকৃতপক্ষে, আমি পাইথনের বেসিকগুলি শিখতে গিয়ে ব্লক স্কোপের বৈশিষ্ট্যটির অভাব দেখে হতাশ হয়ে পড়েছিলাম। যাইহোক একবার পাইথন মডিউলগুলি বুঝতে পারলে আমি ব্লক স্কোপের প্রয়োজন ছাড়াই আমার পূর্ববর্তী লক্ষ্যগুলি আরও সুন্দরভাবে উপলব্ধি করতে পারি।
প্রেরণা হিসাবে এবং সঠিক দিকের দিকে লোককে নির্দেশ করার জন্য, আমি পাইথনের কিছু স্কোপিং নির্মাণের সুস্পষ্ট উদাহরণ প্রদান করা দরকারী বলে মনে করি। প্রথমে আমি ব্লক স্কোপ বাস্তবায়নের জন্য পাইথন ক্লাসগুলি ব্যবহার করার ক্ষেত্রে আমার ব্যর্থ প্রয়াসটি ব্যাখ্যা করি। পরবর্তী আমি ব্যাখ্যা করি কীভাবে আমি পাইথন মডিউলগুলি ব্যবহার করে আরও দরকারী কিছু অর্জন করেছি। শেষে আমি ডেটা লোডিং এবং ফিল্টারিংয়ের জন্য প্যাকেজগুলির ব্যবহারিক প্রয়োগের রূপরেখা তৈরি করি।
ক্লাসগুলির সাথে ব্লক স্কোপের চেষ্টা করা
কয়েক মুহুর্তের জন্য আমি ভেবেছিলাম যে আমি একটি শ্রেণীর ঘোষণার অভ্যন্তরে কোড স্টিক করে ব্লক স্কোপ অর্জন করেছি:
x = 5
class BlockScopeAttempt:
x = 10
print(x)
print(x)
দুর্ভাগ্যক্রমে যখন এই ফাংশন সংজ্ঞায়িত হয় তখন এটি ভেঙে যায়:
x = 5
class BlockScopeAttempt:
x = 10
print(x)
def printx2():
print(x)
printx2()
কারণ শ্রেণীর মধ্যে সংজ্ঞায়িত ফাংশনগুলি বিশ্বব্যাপী সুযোগ ব্যবহার করে। এটিকে সংশোধন করার সবচেয়ে সহজ (যদিও একমাত্র নয়) উপায়টি স্পষ্টভাবে শ্রেণি নির্দিষ্ট করা:
x = 5
class BlockScopeAttempt:
x = 10
print(x)
def printx2():
print(BlockScopeAttempt.x)
printx2()
এটি এত মার্জিত নয় কারণ কোনও শ্রেণিতে অন্তর্ভুক্ত রয়েছে কি না তার উপর নির্ভর করে কারও অবশ্যই আলাদা আলাদাভাবে ফাংশন লিখতে হবে।
পাইথন মডিউলগুলির সাথে আরও ভাল ফলাফল
মডিউলগুলি স্ট্যাটিক ক্লাসগুলির সাথে খুব মিল, তবে আমার অভিজ্ঞতায় মডিউলগুলি অনেক ক্লিনার। মডিউলগুলির সাথে এটি করার জন্য, আমি my_module.py
নিম্নোক্ত সামগ্রীগুলি সহ বর্তমান ওয়ার্কিং ডিরেক্টরিতে কল করা একটি ফাইল তৈরি করি :
x = 10
print(x)
def printx():
global x
print(x)
তারপরে আমার প্রধান ফাইল বা ইন্টারেক্টিভ (উদাহরণস্বরূপ বৃহস্পতি) সেশনে, আমি করি
x = 5
import my_module
my_module.printx()
print(x)
ব্যাখ্যা হিসাবে, প্রতিটি পাইথন ফাইল একটি মডিউল নির্ধারণ করে যার নিজস্ব গ্লোবাল নেমস্পেস রয়েছে। একটি মডিউল আমদানি আপনাকে .
সিনট্যাক্সের সাহায্যে এই নেমস্পেসের ভেরিয়েবলগুলি অ্যাক্সেস করতে দেয় ।
যদি আপনি একটি ইন্টারেক্টিভ সেশনে মডিউলগুলির সাথে কাজ করে থাকেন তবে আপনি শুরুতে এই দুটি লাইনটি কার্যকর করতে পারেন
%load_ext autoreload
%autoreload 2
এবং মডিউলগুলি তাদের সম্পর্কিত ফাইলগুলি সংশোধন করা হলে স্বয়ংক্রিয়ভাবে পুনরায় লোড হবে।
ডেটা লোড এবং ফিল্টার করার জন্য প্যাকেজ
প্যাকেজগুলির ধারণাটি মডিউল ধারণার সামান্য বর্ধন। একটি প্যাকেজ হ'ল একটি ডিরেক্টরি যা একটি (সম্ভবত ফাঁকা) __init__.py
ফাইল থাকে, যা আমদানির পরে সম্পাদিত হয়। এই ডিরেক্টরিতে থাকা মডিউল / প্যাকেজগুলি .
সিনট্যাক্সের সাহায্যে অ্যাক্সেস করা যায় ।
ডেটা বিশ্লেষণের জন্য, আমাকে প্রায়শই একটি বড় ডেটা ফাইল পড়তে হবে এবং তারপরে ইন্টারেক্টিভভাবে বিভিন্ন ফিল্টার প্রয়োগ করতে হবে। একটি ফাইল পড়তে কয়েক মিনিট সময় লাগে, তাই আমি কেবল এটি একবারই করতে চাই। অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং সম্পর্কে স্কুলে আমি যা শিখেছি তার উপর ভিত্তি করে, আমি বিশ্বাস করি যে ক্লাসে পদ্ধতি হিসাবে ফিল্টারিং এবং লোডিংয়ের জন্য কোড লেখা উচিত। এই পদ্ধতির একটি বড় অসুবিধা হ'ল আমি যদি আমার ফিল্টারগুলি পুনরায় সংজ্ঞায়িত করি তবে আমার শ্রেণির সংজ্ঞা পরিবর্তিত হয়, তাই আমাকে ডেটা সহ পুরো ক্লাসটি পুনরায় লোড করতে হবে।
আজকাল পাইথনের সাথে, আমি একটি প্যাকেজ সংজ্ঞায়িত করি my_data
যার নাম load
এবং সাবমডিউল রয়েছে filter
। filter.py
আমি ভিতরে একটি আপেক্ষিক আমদানি করতে পারি:
from .load import raw_data
আমি যদি সংশোধন করি filter.py
, তবে autoreload
পরিবর্তনগুলি সনাক্ত করব। এটি পুনরায় লোড হয় না load.py
, সুতরাং আমার ডেটা পুনরায় লোড করার দরকার নেই। এইভাবে আমি আমার ফিল্টারিং কোডটি একটি বৃহত্তর নোটবুকে প্রোটোটাইপ করতে পারি, এটি একটি ফাংশন হিসাবে মোড়ানো করতে পারি এবং তারপরে আমার নোটবুক থেকে সরাসরি কাট-পেস্ট করতে পারি filter.py
। এটি আবিষ্কার করে আমার কর্মপ্রবাহে বিপ্লব ঘটল এবং আমাকে সন্দেহের হাত থেকে "পাইথনের জেন" -তে বিশ্বাসী হিসাবে রূপান্তরিত করলেন।
One purpose (of many) is to improve code readability
- পাইথন কোড, সঠিকভাবে লেখা (অর্থাত, পাইথনের জেন অনুসরণ করে ) পড়ার জন্য এ জাতীয় গার্নিশের প্রয়োজন হবে না। আসলে, পাইথন সম্পর্কে এটি আমার পছন্দ (অনেকগুলি) বিষয়।