মূল content-এ যাও

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:

main.py

@dataclass দিয়ে একই জিনিস:

main.py

তুমি শুধু 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 এটা চেক করে না:

main.py

কোনো error নেই! Type hint মানুষ আর tool-এর (editor, mypy) জন্য। Dataclass এগুলো দেখে field চেনে, কিন্তু মান যাচাই করে না। (মান যাচাই চাইলে pydantic library — FastAPI-তে দেখবো।)

Mutable default: field(default_factory=...)

মনে আছে mutable default-এর ফাঁদ? Dataclass এটা ধরে ফেলে:

main.py

ValueError! সঠিক উপায় — default_factory, যেটা প্রতিটা object-এর জন্য নতুন list বানায়:

main.py

frozen=True: বদলানো যায় না

main.py

FrozenInstanceError — একবার তৈরি হলে আর বদলানো যায় না। Config-এর জন্য দারুণ: training-এর মাঝখানে কেউ ভুল করে setting বদলে ফেলতে পারবে না। বদলানো config চাইলে নতুন একটা বানাও:

main.py

order=True: তুলনা আর sort

main.py

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

+20 XP

@dataclass দিয়ে TrainConfig বানাও, এই field-গুলো সহ:

  • model_name — str, কোনো default নেই
  • learning_rate — float, default 0.001
  • epochs — int, default 10
  • batch_size — int, default 32

__init__ বা __repr__ নিজে লিখবে না — dataclass বানিয়ে দেবে।

solution.py

Quiz

  1. Q1@dataclass নিজে থেকে কোন method-গুলো বানিয়ে দেয় (default-এ)?
  2. Q2tags: list = [] লিখলে dataclass কী করে?
  3. Q3@dataclass(frozen=True) দিলে কী হয়?
0/3 answered

Challenge

Challenge

Experiment tracker

+50 XP

ML experiment-এর ফলাফল রাখতে dataclass বানাও:

  • Run — name: str, accuracy: float, tags: list (default খালি list — প্রতিটা Run-এর আলাদা!)
  • Run-গুলো accuracy অনুযায়ী তুলনা করা যাবে (<, sorted()), নাম বা tags দিয়ে নয়
  • best_run(runs) function — সবচেয়ে বেশি accuracy-র Run return করবে; খালি list-এ None
solution.py

বাস্তবে কোথায় ব্যবহার হয়?

একটা ছোট experiment tracker — MLflow-এর মতো tool ঠিক এই কাজটাই বড় পরিসরে করে:

main.py

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 কীভাবে পড়বে।