অন্যান্য উত্তরগুলি হাঁসের টাইপিং এবং tzot এর সহজ উত্তরটি ব্যাখ্যা করার জন্য একটি ভাল কাজ করেছে :
পাইথনের ভেরিয়েবলগুলি নেই, অন্যান্য ভাষার মতো যেখানে ভেরিয়েবলের একটি ধরণ এবং মান থাকে; এটিতে বস্তুর প্রতি ইঙ্গিত করার নাম রয়েছে যা তাদের ধরণটি জানে।
তবে , একটি আকর্ষণীয় বিষয় ২০১০ সাল থেকে পরিবর্তিত হয়েছে (যখন প্রশ্নটি প্রথম জিজ্ঞাসা করা হয়েছিল), পিইপি 3107 (পাইথন 3 এ বাস্তবায়িত) এর বাস্তবায়ন। আপনি এখন কোনও প্যারামিটারের ধরন এবং ফাংশনটির রিটার্ন টাইপের ধরণটি নির্দিষ্ট করে বলতে পারেন:
def pick(l: list, index: int) -> int:
return l[index]
আমরা দেখতে পাচ্ছি যে pick
এটি 2 পরামিতি, একটি তালিকা l
এবং একটি পূর্ণসংখ্যা লাগে index
। এটিও একটি পূর্ণসংখ্যা ফেরত দেওয়া উচিত।
সুতরাং এখানে এটি বোঝানো হয়েছে যে l
পূর্ণসংখ্যার একটি তালিকা যা আমরা অনেক প্রচেষ্টা ছাড়াই দেখতে পাই, তবে আরও জটিল ক্রিয়াকলাপগুলির জন্য তালিকাটি কী থাকা উচিত তা কিছুটা বিভ্রান্তিকর হতে পারে। আমরা ডিফল্ট মান index
0 হওয়াও চাই this এটি সমাধান করার জন্য আপনি পরিবর্তে এইভাবে লিখতে পছন্দ করতে pick
পারেন:
def pick(l: "list of ints", index: int = 0) -> int:
return l[index]
নোট করুন যে আমরা এখন স্ট্রিংয়ের ধরণ হিসাবে l
রেখেছি, যা সিনথেটিকভাবে অনুমোদিত, তবে প্রোগ্রামিকভাবে পার্স করা ভাল নয় (যা আমরা পরে ফিরে আসব)।
এটি লক্ষণীয় গুরুত্বপূর্ণ যে TypeError
আপনি যদি কোনও ফ্লোটটি পাস করেন তবে পাইথন একটি উত্থাপন করবে না index
, এর কারণ পাইথনের নকশার দর্শনের অন্যতম মূল বিষয়: "আমরা সকলেই এখানে সম্মতি প্রাপ্তবয়স্করা" , যার অর্থ আপনার প্রত্যাশিত আপনি কোনও ফাংশনে কী কী পাস করতে পারবেন এবং কী করতে পারবেন না সে সম্পর্কে সচেতন হন। আপনি যদি সত্যই এমন কোড লিখতে চান যা isinstance
প্রকারের ত্রুটিগুলি ছুড়ে ফেলে আপনি এই ফাংশনটি ব্যবহার করে পরীক্ষা করতে পারেন যে উত্তীর্ণ আর্গুমেন্টটি সঠিক ধরণের বা এর মতো একটি সাবক্লাসের মতো:
def pick(l: list, index: int = 0) -> int:
if not isinstance(l, list):
raise TypeError
return l[index]
আপনার কেন কমই করা উচিত এবং এর পরিবর্তে আপনার কী করা উচিত সে সম্পর্কে আরও পরবর্তী বিভাগে এবং মন্তব্যে আলোচনা করা হয়েছে।
পিইপি 3107 কেবল কোড পঠনযোগ্যতার উন্নতি করে না তবে এখানে বেশ কয়েকটি উপযুক্ত ব্যবহারের কেস রয়েছে যা আপনি এখানে পড়তে পারেন ।
টাইপ টীকাগুলি পিইপি 484 প্রবর্তনের সাথে পাইথন 3.5 তে আরও বেশি মনোযোগ পেল যা টাইপ ইঙ্গিতগুলির জন্য একটি স্ট্যান্ডার্ড মডিউল প্রবর্তন করে।
এই ধরণের ইঙ্গিতগুলি টাইপ চেকার মাইপি ( গিটহাব ) থেকে এসেছে , যা এখন পিইপি 484 অনুগত।
টাইপিং মডিউলটি সহ টাইপ ইঙ্গিতগুলির একটি দুর্দান্ত বিস্তৃত সংগ্রহ সহ আসে:
List
, Tuple
, Set
, Map
- জন্য list
, tuple
, set
এবং map
যথাক্রমে।
Iterable
- জেনারেটর জন্য দরকারী।
Any
- যখন এটি কিছু হতে পারে।
Union
- যখন এটি কোনও নির্দিষ্ট ধরণের সেটগুলির বিপরীতে কিছু হতে পারে Any
।
Optional
- যখন এটি কিছুই নাও হতে পারে। শর্টহ্যান্ডের জন্য Union[T, None]
।
TypeVar
- জেনেরিকের সাথে ব্যবহৃত
Callable
- মূলত ফাংশনগুলির জন্য ব্যবহৃত হয়, তবে অন্যান্য কলযোগ্যগুলির জন্য এটি ব্যবহার করা যেতে পারে।
এগুলি সর্বাধিক সাধারণ ধরণের ইঙ্গিত। টাইপিং মডিউলটির জন্য ডকুমেন্টেশনে একটি সম্পূর্ণ তালিকা পাওয়া যাবে ।
টাইপিং মডিউলটিতে প্রবর্তিত টীকাগুলি ব্যবহার করে পুরানো উদাহরণ এখানে দেওয়া হয়েছে:
from typing import List
def pick(l: List[int], index: int) -> int:
return l[index]
একটি শক্তিশালী বৈশিষ্ট্য হ'ল Callable
যা আপনাকে এ্যানোটেট পদ্ধতিগুলি টাইপ করতে দেয় যা একটি যুক্তি হিসাবে কোনও ফাংশন নেয়। উদাহরণ স্বরূপ:
from typing import Callable, Any, Iterable
def imap(f: Callable[[Any], Any], l: Iterable[Any]) -> List[Any]:
"""An immediate version of map, don't pass it any infinite iterables!"""
return list(map(f, l))
উপরের উদাহরণটি TypeVar
পরিবর্তে এর ব্যবহারের সাথে আরও সুনির্দিষ্ট হয়ে উঠতে পারে Any
, তবে এটি পাঠকের কাছে অনুশীলন হিসাবে ছেড়ে দেওয়া হয়েছে যেহেতু আমি বিশ্বাস করি যে আমি ইতিমধ্যে আমার উত্তরটি টাইপ হিন্টিং দ্বারা সক্ষম বিস্ময়কর নতুন বৈশিষ্ট্যগুলি সম্পর্কে খুব বেশি তথ্য দিয়ে পূর্ণ করেছি।
পূর্বে যখন এক সঙ্গে উদাহরণস্বরূপ পাইথন কোড নথিভুক্ত স্পিংক্স উপরে কার্যকারিতা কিছু ভালো ফরম্যাট docstrings লেখার দ্বারা প্রাপ্ত করা যেতে পারে:
def pick(l, index):
"""
:param l: list of integers
:type l: list
:param index: index at which to pick an integer from *l*
:type index: int
:returns: integer at *index* in *l*
:rtype: int
"""
return l[index]
আপনি দেখতে পাচ্ছেন, এটি বেশ কয়েকটি অতিরিক্ত লাইন গ্রহণ করে (সঠিক সংখ্যাটি আপনি কতটা সুস্পষ্ট হতে চান এবং কীভাবে আপনি আপনার ডকাস্ট্রিংটি ফর্ম্যাট করেন তার উপর নির্ভর করে)। তবে এটি এখন আপনার কাছে স্পষ্ট হওয়া উচিত যে কীভাবে পিইপি 3107 একটি বিকল্প সরবরাহ করে যা অনেক (সমস্ত?) উপায়ে উন্নত। এটি পিইপি 484 এর সাথে একত্রে সত্য যা আমরা দেখেছি যে একটি স্ট্যান্ডার্ড মডিউল সরবরাহ করে যা এই ধরণের ইঙ্গিতগুলি / টীকাগুলির জন্য একটি সিনট্যাক্স সংজ্ঞায়িত করে যে এটি এমনভাবে ব্যবহার করা যেতে পারে যে এটি দ্ব্যর্থহীন এবং সুনির্দিষ্টভাবে এখনও নমনীয় হয়, এটি তৈরি করার জন্য শক্তিশালী সমন্বয়।
আমার ব্যক্তিগত মতে এটি পাইথনের সর্বকালের অন্যতম সেরা বৈশিষ্ট্য। লোকেরা এর শক্তিকে ব্যবহার করা শুরু করার জন্য আমি অপেক্ষা করতে পারি না। দীর্ঘ উত্তরের জন্য দুঃখিত, তবে আমি উত্তেজিত হয়ে উঠলে এটি ঘটে।
পাইথন কোডের উদাহরণ যা ভারীভাবে টাইপ হিন্টিং ব্যবহার করে তা এখানে পাওয়া যাবে ।