Python-এ ঐচ্ছিক "টাইপ হিন্ট" (যা "টাইপ অ্যানোটেশন" নামেও পরিচিত) এর জন্য সাপোর্ট রয়েছে।
এই "টাইপ হিন্ট" বা অ্যানোটেশনগুলি এক ধরণের বিশেষ সিনট্যাক্স যা একটি ভেরিয়েবলের টাইপ ঘোষণা করতে দেয়।
ভেরিয়েবলগুলির জন্য টাইপ ঘোষণা করলে, এডিটর এবং টুলগুলি আপনাকে আরও ভালো সাপোর্ট দিতে পারে।
এটি পাইথন টাইপ হিন্ট সম্পর্কে একটি দ্রুত টিউটোরিয়াল / রিফ্রেশার মাত্র। এটি FastAPI এর সাথে ব্যবহার করার জন্য শুধুমাত্র ন্যূনতম প্রয়োজনীয়তা কভার করে... যা আসলে খুব একটা বেশি না।
FastAPI এই টাইপ হিন্টগুলির উপর ভিত্তি করে নির্মিত, যা এটিকে অনেক সুবিধা এবং লাভ প্রদান করে।
তবে, আপনি যদি কখনো FastAPI ব্যবহার নাও করেন, তবুও এগুলি সম্পর্কে একটু শেখা আপনার উপকারে আসবে।
Note
যদি আপনি একজন Python বিশেষজ্ঞ হন, এবং টাইপ হিন্ট সম্পর্কে সবকিছু জানেন, তাহলে পরবর্তী অধ্যায়ে চলে যান।
typing ব্যবহার করা সিনট্যাক্সটি Python 3.6 থেকে সর্বশেষ সংস্করণগুলি পর্যন্ত, অর্থাৎ Python 3.9, Python 3.10 ইত্যাদি সহ সকল সংস্করণের সাথে সামঞ্জস্যপূর্ণ।
Python যত এগিয়ে যাচ্ছে, নতুন সংস্করণগুলি এই টাইপ অ্যানোটেশনগুলির জন্য তত উন্নত সাপোর্ট নিয়ে আসছে এবং অনেক ক্ষেত্রে আপনাকে টাইপ অ্যানোটেশন ঘোষণা করতে typing মডিউল ইম্পোর্ট এবং ব্যবহার করার প্রয়োজন হবে না।
যদি আপনি আপনার প্রজেক্টের জন্য Python-এর আরও সাম্প্রতিক সংস্করণ নির্বাচন করতে পারেন, তাহলে আপনি সেই অতিরিক্ত সরলতা থেকে সুবিধা নিতে পারবেন।
ডক্সে রয়েছে Python-এর প্রতিটি সংস্করণের সাথে সামঞ্জস্যপূর্ণ উদাহরণগুলি (যখন পার্থক্য আছে)।
উদাহরণস্বরূপ, "Python 3.6+" মানে এটি Python 3.6 বা তার উপরে সামঞ্জস্যপূর্ণ (যার মধ্যে 3.7, 3.8, 3.9, 3.10, ইত্যাদি অন্তর্ভুক্ত)। এবং "Python 3.9+" মানে এটি Python 3.9 বা তার উপরে সামঞ্জস্যপূর্ণ (যার মধ্যে 3.10, ইত্যাদি অন্তর্ভুক্ত)।
যদি আপনি Python-এর সর্বশেষ সংস্করণগুলি ব্যবহার করতে পারেন, তাহলে সর্বশেষ সংস্করণের জন্য উদাহরণগুলি ব্যবহার করুন, সেগুলি আপনাকে সর্বোত্তম এবং সহজতম সিনট্যাক্স প্রদান করবে, যেমন, "Python 3.10+"।
আপনি একটি ভেরিয়েবলকে এমনভাবে ঘোষণা করতে পারেন যেন তা একাধিক টাইপের হয়, উদাহরণস্বরূপ, একটি int অথবা str।
Python 3.6 এবং তার উপরের সংস্করণগুলিতে (Python 3.10 অন্তর্ভুক্ত) আপনি typing থেকে Union টাইপ ব্যবহার করতে পারেন এবং স্কোয়ার ব্র্যাকেটের মধ্যে গ্রহণযোগ্য টাইপগুলি রাখতে পারেন।
Python 3.10-এ একটি নতুন সিনট্যাক্স আছে যেখানে আপনি সম্ভাব্য টাইপগুলিকে একটি ভার্টিকাল বার (|) দ্বারা পৃথক করতে পারেন।
Optional[str] ব্যবহার করা মানে হল শুধু str নয়, এটি হতে পারে None-ও, যা আপনার এডিটরকে সেই ত্রুটিগুলি শনাক্ত করতে সাহায্য করবে যেখানে আপনি ধরে নিচ্ছেন যে একটি মান সবসময় str হবে, অথচ এটি None-ও হতে পারেও।
Optional[Something] মূলত Union[Something, None]-এর একটি শর্টকাট, এবং তারা সমতুল্য।
এর মানে হল, Python 3.10-এ, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে Something | None ব্যবহার করতে পারেন:
যদি আপনি Python 3.10-এর নীচের সংস্করণ ব্যবহার করেন, তবে এখানে আমার খুবই ব্যক্তিগত দৃষ্টিভঙ্গি থেকে একটি টিপস:
🚨 Optional[SomeType] ব্যবহার এড়িয়ে চলুন।
এর পরিবর্তে ✨ Union[SomeType, None] ব্যবহার করুন ✨।
উভয়ই সমতুল্য এবং মূলে একই, কিন্তু আমি Union-এর পক্ষে সুপারিশ করব কারণ "অপশনাল" শব্দটি মনে হতে পারে যে মানটি ঐচ্ছিক,অথচ এটি আসলে মানে "এটি হতে পারে None", এমনকি যদি এটি ঐচ্ছিক না হয়েও আবশ্যিক হয়।
আমি মনে করি Union[SomeType, None] এর অর্থ আরও স্পষ্টভাবে প্রকাশ করে।
এটি কেবল শব্দ এবং নামের ব্যাপার। কিন্তু সেই শব্দগুলি আপনি এবং আপনার সহকর্মীরা কোড সম্পর্কে কীভাবে চিন্তা করেন তা প্রভাবিত করতে পারে।
name প্যারামিটারটি Optional[str] হিসেবে সংজ্ঞায়িত হয়েছে, কিন্তু এটি অপশনাল নয়, আপনি প্যারামিটার ছাড়া ফাংশনটি কল করতে পারবেন না:
say_hi()# ওহ না, এটি একটি ত্রুটি নিক্ষেপ করবে! 😱
name প্যারামিটারটি এখনও আবশ্যিক (নন-অপশনাল) কারণ এটির কোনো ডিফল্ট মান নেই। তবুও, name এর মান হিসেবে None গ্রহণযোগ্য:
say_hi(name=None)# এটি কাজ করে, None বৈধ 🎉
সুখবর হল, একবার আপনি Python 3.10 ব্যবহার করা শুরু করলে, আপনাকে এগুলোর ব্যাপারে আর চিন্তা করতে হবে না, যেহুতু আপনি | ব্যবহার করেই ইউনিয়ন ঘোষণা করতে পারবেন:
defsay_hi(name:str|None):print(f"Hey {name}!")
এবং তারপর আপনাকে নামগুলি যেমন Optional এবং Union নিয়ে আর চিন্তা করতে হবে না। 😎
স্কোয়ার ব্র্যাকেটে টাইপ প্যারামিটার নেওয়া এই টাইপগুলিকে জেনেরিক টাইপ বা জেনেরিকস বলা হয়, যেমন:
আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে):
list
tuple
set
dict
এবং Python 3.8 এর মতোই, typing মডিউল থেকে:
Union
Optional (Python 3.8 এর মতোই)
...এবং অন্যান্য।
Python 3.10-এ, Union এবং Optional জেনেরিকস ব্যবহার করার বিকল্প হিসেবে, আপনি টাইপগুলির ইউনিয়ন ঘোষণা করতে ভার্টিকাল বার (|) ব্যবহার করতে পারেন, যা ওদের থেকে অনেক ভালো এবং সহজ।
আপনি সেই একই বিল্টইন টাইপ জেনেরিক্স হিসেবে ব্যবহার করতে পারবেন(ভিতরে টাইপ সহ স্কয়ারে ব্রাকেট দিয়ে):
Pydantic হল একটি Python লাইব্রেরি যা ডাটা ভ্যালিডেশন সম্পাদন করে।
আপনি ডাটার "আকার" এট্রিবিউট সহ ক্লাস হিসেবে ঘোষণা করেন।
এবং প্রতিটি এট্রিবিউট এর একটি টাইপ থাকে।
তারপর আপনি যদি কিছু মান দিয়ে সেই ক্লাসের একটি ইন্সট্যান্স তৈরি করেন-- এটি মানগুলিকে ভ্যালিডেট করবে, প্রয়োজন অনুযায়ী তাদেরকে উপযুক্ত টাইপে রূপান্তর করবে এবং আপনাকে সমস্ত ডাটা সহ একটি অবজেক্ট প্রদান করবে।
এবং আপনি সেই ফলাফল অবজেক্টের সাথে এডিটর সাপোর্ট পাবেন।
যখন আপনি Optional বা Union[Something, None] ব্যবহার করেন এবং কোনো ডিফল্ট মান না থাকে, Pydantic-এর একটি বিশেষ আচরণ রয়েছে, আপনি Pydantic ডকুমেন্টেশনে Required Optional fields সম্পর্কে আরও পড়তে পারেন।
Python-এ এমন একটি ফিচার আছে যা Annotated ব্যবহার করে এই টাইপ হিন্টগুলিতে অতিরিক্ত মেটাডাটা রাখতে দেয়।
Python 3.9-এ, Annotated স্ট্যান্ডার্ড লাইব্রেরিতে অন্তর্ভুক্ত, তাই আপনি এটি typing থেকে ইমপোর্ট করতে পারেন।
fromtypingimportAnnotateddefsay_hello(name:Annotated[str,"this is just metadata"])->str:returnf"Hello {name}"
Python 3.9-এর নীচের সংস্করণগুলিতে, আপনি Annotated-কে typing_extensions থেকে ইমপোর্ট করেন।
এটি FastAPI এর সাথে ইতিমদ্ধে ইনস্টল হয়ে থাকবে।
fromtyping_extensionsimportAnnotateddefsay_hello(name:Annotated[str,"this is just metadata"])->str:returnf"Hello {name}"
Python নিজে এই Annotated দিয়ে কিছুই করে না। এবং এডিটর এবং অন্যান্য টুলগুলির জন্য, টাইপটি এখনও str।
কিন্তু আপনি এই Annotated এর মধ্যকার জায়গাটির মধ্যে FastAPI-এ কীভাবে আপনার অ্যাপ্লিকেশন আচরণ করুক তা সম্পর্কে অতিরিক্ত মেটাডাটা প্রদান করার জন্য ব্যবহার করতে পারেন।
মনে রাখার গুরুত্বপূর্ণ বিষয় হল যে প্রথম টাইপ প্যারামিটার আপনি Annotated-এ পাস করেন সেটি হল আসল টাইপ। বাকি শুধুমাত্র অন্যান্য টুলগুলির জন্য মেটাডাটা।
এখন আপনার কেবল জানা প্রয়োজন যে Annotated বিদ্যমান, এবং এটি স্ট্যান্ডার্ড Python। 😎
পরবর্তীতে আপনি দেখবেন এটি কতটা শক্তিশালী হতে পারে।
Tip
এটি স্ট্যান্ডার্ড Python হওয়ার মানে হল আপনি আপনার এডিটরে, আপনি যে টুলগুলি কোড বিশ্লেষণ এবং রিফ্যাক্টর করার জন্য ব্যবহার করেন তাতে সেরা সম্ভাব্য ডেভেলপার এক্সপেরিয়েন্স পাবেন। ✨
এবং এছাড়াও আপনার কোড অন্যান্য অনেক Python টুল এবং লাইব্রেরিগুলির সাথে খুব সামঞ্জস্যপূর্ণ হবে। 🚀
FastAPI এই টাইপ হিন্টগুলি ব্যবহার করে বেশ কিছু জিনিস করে।
FastAPI-এ আপনি টাইপ হিন্টগুলি সহ প্যারামিটার ঘোষণা করেন এবং আপনি পান:
এডিটর সাপোর্ট।
টাইপচেক।
...এবং FastAPI একই ঘোষণাগুলি ব্যবহার করে:
রিকুইরেমেন্টস সংজ্ঞায়িত করে: রিকোয়েস্ট পাথ প্যারামিটার, কুয়েরি প্যারামিটার, হেডার, বডি, ডিপেন্ডেন্সিস, ইত্যাদি থেকে।
ডেটা রূপান্তর করে: রিকোয়েস্ট থেকে প্রয়োজনীয় টাইপে ডেটা।
ডেটা যাচাই করে: প্রতিটি রিকোয়েস্ট থেকে আসা ডেটা:
যখন ডেটা অবৈধ হয় তখন স্বয়ংক্রিয় ত্রুটি গ্রাহকের কাছে ফেরত পাঠানো।
API ডকুমেন্টেশন তৈরি করে: OpenAPI ব্যবহার করে:
যা স্বয়ংক্রিয় ইন্টার্যাক্টিভ ডকুমেন্টেশন ইউজার ইন্টারফেস দ্বারা ব্যবহৃত হয়।
এই সব কিছু আপনার কাছে অস্পষ্ট মনে হতে পারে। চিন্তা করবেন না। আপনি টিউটোরিয়াল - ইউজার গাইড এ এই সব কিছু প্র্যাকটিসে দেখতে পাবেন।
গুরুত্বপূর্ণ বিষয় হল, আপনি যদি স্ট্যান্ডার্ড Python টাইপগুলি ব্যবহার করেন, তবে আরও বেশি ক্লাস, ডেকোরেটর ইত্যাদি যোগ না করেই একই স্থানে FastAPI আপনার অনেক কাজ করে দিবে।
Info
যদি আপনি টিউটোরিয়ালের সমস্ত বিষয় পড়ে ফেলে থাকেন এবং টাইপ সম্পর্কে আরও জানতে চান, তবে একটি ভালো রিসোর্স হল mypy এর "cheat sheet"। এই "cheat sheet" এ আপনি Python টাইপ হিন্ট সম্পর্কে বেসিক থেকে উন্নত লেভেলের ধারণা পেতে পারেন, যা আপনার কোডে টাইপ সেফটি এবং স্পষ্টতা বাড়াতে সাহায্য করবে।