Python for AI/Object-Oriented Programming/Lesson 26
Dataclasses
@dataclass দিয়ে __init__, __repr__, __eq__ নিজে থেকে — default মান, field(default_factory=...), frozen আর ordering। ML config আর experiment result রাখার সবচেয়ে পরিষ্কার উপায়।
- সময়
- 20 মিনিট
- Exercise
- 1
- Challenge
- 1
- Quiz
- 3 প্রশ্ন
সহজ ভাষায়
শুধু data রাখার একটা class লিখতে গেলে প্রচুর একই রকম code:
@dataclass দিয়ে একই জিনিস:
তুমি শুধু field-গুলো লেখো — নাম, type, আর ঐচ্ছিক default। __init__, __repr__, __eq__ Python নিজে বানিয়ে দেয়।
কেন দরকার?
ML project-এ অনেক জিনিস আসলে শুধু "data-র বাক্স":
- Training config — learning rate, epochs, batch size
- Experiment result — model নাম, accuracy, সময়
- Prediction — label, confidence
Dictionary দিয়েও রাখা যায়, কিন্তু dataclass-এ:
- typo ধরা পড়ে —
cfg.learnig_rateলিখলে সাথে সাথেAttributeError; dictionary-তেcfg["learnig_rate"]চুপচাপ ভুল key বানাতে পারে - কী কী field আছে আর তাদের type — code দেখেই বোঝা যায়, editor autocomplete করে
- সুন্দর
repr— debugging সহজ
Hugging Face Transformers-এর TrainingArguments একটা dataclass — ১০০-র বেশি field সহ।
Type hints
name: str — এখানে : str হলো type hint। এটা বলে দেয় কী ধরনের মান আশা করা হচ্ছে। সাবধান: Python এটা চেক করে না:
কোনো error নেই! Type hint মানুষ আর tool-এর (editor, mypy) জন্য। Dataclass এগুলো দেখে field চেনে, কিন্তু মান যাচাই করে না। (মান যাচাই চাইলে pydantic library — FastAPI-তে দেখবো।)
Mutable default: field(default_factory=...)
মনে আছে mutable default-এর ফাঁদ? Dataclass এটা ধরে ফেলে:
ValueError! সঠিক উপায় — default_factory, যেটা প্রতিটা object-এর জন্য নতুন list বানায়:
frozen=True: বদলানো যায় না
FrozenInstanceError — একবার তৈরি হলে আর বদলানো যায় না। Config-এর জন্য দারুণ: training-এর মাঝখানে কেউ ভুল করে setting বদলে ফেলতে পারবে না। বদলানো config চাইলে নতুন একটা বানাও:
order=True: তুলনা আর sort
order=True field-গুলোর ক্রম অনুযায়ী তুলনা করে। field(compare=False) দিলে সেই field তুলনায় বাদ যায়।
Dataclass বনাম dict বনাম সাধারণ class
| কখন | |
|---|---|
dict | কাঠামো আগে থেকে জানা নেই, JSON-এর মতো খোলা data |
@dataclass | কাঠামো জানা, মূলত data রাখা — config, result, record |
| সাধারণ class | জটিল আচরণ, অনেক method, inheritance — যেমন model |
Exercise
Exercise
Training config
@dataclass দিয়ে TrainConfig বানাও, এই field-গুলো সহ:
model_name—str, কোনো default নেইlearning_rate—float, default0.001epochs—int, default10batch_size—int, default32
__init__ বা __repr__ নিজে লিখবে না — dataclass বানিয়ে দেবে।
Quiz
Challenge
Challenge
Experiment tracker
ML experiment-এর ফলাফল রাখতে dataclass বানাও:
Run—name: str,accuracy: float,tags: list(default খালি list — প্রতিটা Run-এর আলাদা!)Run-গুলো accuracy অনুযায়ী তুলনা করা যাবে (<,sorted()), নাম বা tags দিয়ে নয়best_run(runs)function — সবচেয়ে বেশি accuracy-রRunreturn করবে; খালি list-এNone
বাস্তবে কোথায় ব্যবহার হয়?
একটা ছোট experiment tracker — MLflow-এর মতো tool ঠিক এই কাজটাই বড় পরিসরে করে:
asdict() dataclass-কে dictionary বানায় — তারপর json.dumps() দিয়ে save করা যায়। এভাবেই experiment-এর ফলাফল file বা database-এ রাখা হয়।
Interview প্রশ্ন
- Beginner:
@dataclassকী করে? সাধারণ class-এর চেয়ে সুবিধা কী? - Intermediate: Dataclass-এ
tags: list = []কেন error দেয়? কীভাবে ঠিক করবে? - Advanced:
dataclass,NamedTuple, আরpydantic.BaseModel— কখন কোনটা? (Pydantic runtime-এ type যাচাই করে — API input-এর জন্য দরকারি।)
এরপর কী?
অভিনন্দন! 🎉 Object-Oriented Programming module শেষ। তুমি এখন class বানাতে, inherit করতে, dunder দিয়ে Pythonic object বানাতে পারো — PyTorch আর scikit-learn-এর code এখন অনেক বেশি পরিচিত লাগবে।
পরের module: Errors ও Files — program ভেঙে না পড়ে কীভাবে error সামলাবে, আর file, JSON, CSV থেকে real data কীভাবে পড়বে।