আমি পিইপি 483 এবং পিইপি 484 পড়ার এবং টাইপ হিন্টিংয়ের বিষয়ে গিডোর এই উপস্থাপনাটি দেখার পরামর্শ দেব ।
সংক্ষেপে : টাইপ হিন্টিং শব্দের অর্থ আক্ষরিক অর্থ, আপনি যে বস্তুর (গুলি) ব্যবহার করছেন তা ইঙ্গিত করেছেন ।
পাইথনের গতিশীল প্রকৃতির কারণে , কোন বস্তুর ব্যবহার অনুমান করা বা তার ধরণ নির্ধারণ করা বা পরীক্ষা করা বিশেষত শক্ত। এই সত্যটি বিকাশকারীদের পক্ষে ঠিক কী কোডটি তারা লিখেছেন না তা কী বুঝতে পারে তা বোঝা শক্ত করে তোলে এবং সবচেয়ে গুরুত্বপূর্ণ, অনেক আইডিইতে পাওয়া টাইপ চেকিং সরঞ্জামগুলির জন্য [পাইকার্ম, পিডিএভ মনে পড়ে] যা এই কারণে সীমাবদ্ধ রয়েছে যে বস্তুগুলি কী ধরণের তা তাদের কোনও সূচক নেই। ফলস্বরূপ তারা প্রায় 50% সাফল্যের হারের সাথে (উপস্থাপনায় উল্লিখিত) প্রকারটি অনুমান করার চেষ্টা করে।
টাইপ হিন্টিং উপস্থাপনা থেকে দুটি গুরুত্বপূর্ণ স্লাইড নিতে:
কেন ইঙ্গিতগুলি টাইপ করুন?
- প্রকারের চেকারগুলিকে সহায়তা করে: কোন ধরণের প্রকারটি আপনি কী ধরণের চাইছেন তা ইঙ্গিত করে সহজেই সনাক্ত করতে পারেন যদি উদাহরণস্বরূপ, আপনি কোনও ধরণের প্রত্যাশিত নয় এমন কোনও বস্তু দিয়ে যাচ্ছেন।
- ডকুমেন্টেশনে সহায়তা করে: আপনার কোড দেখছেন এমন একজন তৃতীয় ব্যক্তি জানতে পারবেন কোথায় কী হবে, কীভাবে তা না পেয়ে কীভাবে ব্যবহার করবেন
TypeErrors
।
- আইডিইগুলিকে আরও নির্ভুল এবং শক্তিশালী সরঞ্জাম বিকাশ করতে সহায়তা করে: আপনার বস্তুটি কী ধরণের তা জেনে যখন বিকাশ পরিবেশ উপযুক্ত পদ্ধতিগুলি প্রস্তাব করার ক্ষেত্রে আরও উপযুক্ত হবে suited আপনি সম্ভবত এটি কোনও আইডিইর সাথে অভিজ্ঞতা অর্জন করেছেন,
.
কোনও বিষয়টির জন্য সংজ্ঞায়িত নয় এমন পদ্ধতি / বৈশিষ্ট্যগুলি পপ আপকে আঘাত করে এবং রাখছেন।
স্ট্যাটিক টাইপ চেকার কেন ব্যবহার করবেন?
- তাত্ক্ষণিক বাগগুলি সন্ধান করুন : এটি স্বয়ংসম্পূর্ণ, আমি বিশ্বাস করি।
- আপনার প্রকল্পটি যত বড় আপনার প্রয়োজন হবে : আবারও তা বোঝার জন্য। স্থির ভাষাগুলি একটি দৃust়তা এবং নিয়ন্ত্রণ দেয় যা গতিশীল ভাষার অভাব থাকে। আপনার অ্যাপ্লিকেশনটি যত বড় এবং জটিল হবে আপনার তত বেশি নিয়ন্ত্রণ এবং ভবিষ্যদ্বাণী হয়ে যায় (আচরণগত দিক থেকে) require
- বড় দলগুলি ইতিমধ্যে স্থির বিশ্লেষণ চালাচ্ছে : আমি অনুমান করছি যে এটি প্রথম দুটি পয়েন্ট যাচাই করে।
এই ছোট পরিচিতির জন্য একটি সমাপনী নোট হিসাবে : এটি একটি alচ্ছিক বৈশিষ্ট্য এবং যা আমি বুঝতে পেরেছি, এটি স্ট্যাটিক টাইপিংয়ের কিছু সুবিধা কাটানোর জন্য চালু করা হয়েছিল।
আপনি সাধারণত না এটা সম্পর্কে চিন্তা করতে হবে এবং স্পষ্টভাবে এটি ব্যবহার করতে (বিশেষত ক্ষেত্রে যেখানে আপনি একটি অক্জিলিয়ারী স্ক্রিপ্টিং ভাষা হিসেবে পাইথন ব্যবহারে আছে) প্রয়োজন হবে না। বড় প্রকল্পগুলি বিকাশ করার সময় এটি সহায়ক হতে পারে কারণ এটি প্রচুর দৃ rob়তা, নিয়ন্ত্রণ এবং অতিরিক্ত ডিবাগিং ক্ষমতা সরবরাহ করে ।
মাইপি সহ হিন্টিং টাইপ করুন :
এই উত্তরটি আরও সম্পূর্ণ করার জন্য, আমি মনে করি যে একটু বিক্ষোভ উপযুক্ত হবে। আমি ব্যবহার করব mypy
, লাইব্রেরি যা প্রকারের ইঙ্গিতগুলিকে পিইপিতে উপস্থাপিত করার জন্য অনুপ্রাণিত করেছিল। এটি মূলত এই প্রশ্নটির জন্য যে কারও জন্য ঝাঁপিয়ে পড়ে এবং কোথায় শুরু করা যায় তা নিয়ে ভাবছেন।
আমি এটি করার আগে আমাকে নিম্নলিখিতগুলি পুনর্বার বলি: পিইপি 484 কিছুই প্রয়োগ করে না; এটি কেবল ফাংশন টীকাগুলির জন্য একটি নির্দেশিকা নির্ধারণ করছে এবং কীভাবে টাইপ চেকিং করা যায় / করা উচিত তার জন্য নির্দেশিকাগুলি প্রস্তাব করা হচ্ছে। আপনি আপনার ফাংশনগুলি বর্নিত করতে পারেন এবং যতগুলি চান ইঙ্গিত করতে পারেন; আপনার স্ক্রিপ্টগুলি টীকাগুলির উপস্থিতি নির্বিশেষে চলবে কারণ পাইথন নিজেই সেগুলি ব্যবহার করে না।
যাইহোক, পিইপিতে উল্লিখিত হিসাবে, হিন্টিং ধরণের সাধারণত তিনটি ফর্ম নেওয়া উচিত:
- ফাংশন টিকা। ( পিইপি 3107 )
- অন্তর্নির্মিত / ব্যবহারকারী মডিউলগুলির জন্য স্টব ফাইলগুলি।
# type: type
প্রথম দুটি ফর্ম পরিপূরক বিশেষ মন্তব্য। (দেখুন: পাইথন ৩.6-এ পরিবর্তনীয় টীকাগুলি কী?# type: type
মন্তব্যগুলির জন্য পাইথন ৩.6 আপডেটের জন্য )
অতিরিক্তভাবে, আপনি typing
প্রবর্তিত নতুন মডিউলটির সাথে একত্রে প্রকারের ইঙ্গিতগুলি ব্যবহার করতে চাইবেন Py3.5
। এতে, অনেকগুলি (অতিরিক্ত) এবিসি (বিমূর্ত বেস ক্লাস) স্থির চেকিংয়ে ব্যবহারের জন্য সহায়ক ফাংশন এবং সজ্জকারদের সাথে সংজ্ঞায়িত করা হয়। সর্বাধিক ABCs
মধ্যে collections.abc
অন্তর্ভুক্ত করা হয় কিন্তু একটি Generic
অনুক্রমে ফর্ম সাবস্ক্রিপশন করার অনুমতি (ক সংজ্ঞা দ্বারা __getitem__()
পদ্ধতি)।
এগুলির আরও গভীরতর ব্যাখ্যায় আগ্রহী যে কোনও ব্যক্তির জন্য, এটি mypy documentation
খুব সুন্দরভাবে লেখা হয়েছে এবং তাদের চেকারের কার্যকারিতা বর্ণনা / বর্ণনা করার জন্য প্রচুর কোড নমুনা রয়েছে; এটি অবশ্যই পড়ার পক্ষে মূল্যবান।
ফাংশন টীকা এবং বিশেষ মন্তব্য:
প্রথমত, বিশেষ মন্তব্যগুলি ব্যবহার করার সময় আমরা পেতে পারি এমন কিছু আচরণ পর্যবেক্ষণ করা আকর্ষণীয়। # type: type
ভেরিয়েবল অ্যাসাইনমেন্টের সময় বিশেষ মন্তব্য যুক্ত করা যেতে পারে যদি কোনও ব্যক্তির সরাসরি অনুমান করা যায় না তবে কোনও সামগ্রীর ধরণটি নির্দেশ করতে পারে। সাধারণ অ্যাসাইনমেন্টগুলি সাধারণত সহজেই অনুমান করা হয় তবে অন্যদের মতো তালিকাগুলি (তাদের বিষয়বস্তু সম্পর্কে), পারে না।
দ্রষ্টব্য: আমরা যদি কোনও Containers
ধারক ব্যবহার করতে চাই এবং সেই ধারকটির জন্য বিষয়বস্তু নির্দিষ্ট করতে চাই তবে আমাদের অবশ্যই মডিউল থেকে জেনেরিক প্রকারগুলি ব্যবহার করতে হবেtyping
। এই সমর্থন সূচী।
# generic List, supports indexing.
from typing import List
# In this case, the type is easily inferred as type: int.
i = 0
# Even though the type can be inferred as of type list
# there is no way to know the contents of this list.
# By using type: List[str] we indicate we want to use a list of strings.
a = [] # type: List[str]
# Appending an int to our list
# is statically not correct.
a.append(i)
# Appending a string is fine.
a.append("i")
print(a) # [0, 'i']
যদি আমরা কোনও ফাইলগুলিতে এই কমান্ডগুলি যুক্ত করি এবং আমাদের দোভাষী দ্বারা এটি কার্যকর করি তবে সবকিছু ঠিকঠাক কাজ করে এবং print(a)
কেবলমাত্র লিস্টের বিষয়বস্তু মুদ্রণ করে a
। # type
মন্তব্য বাতিল করা হয়েছে, প্লেইন মন্তব্য যা কোন অতিরিক্ত শব্দার্থিক অর্থ আছে বলে গণ্য ।
সঙ্গে এই চলার mypy
অপরপক্ষে, আমরা কোন সাড়া পাবেন:
(Python3)jimmi@jim: mypy typeHintsCode.py
typesInline.py:14: error: Argument 1 to "append" of "list" has incompatible type "int"; expected "str"
ইঙ্গিত করে যে str
বস্তুর তালিকায় int
কোনওটি থাকতে পারে না , যা স্থিরভাবে বলা যায়, এটি দুর্দান্ত। এটি হয় ধরণ পালনকারী দ্বারা সংশোধন করা যেতে পারে a
এবং শুধুমাত্র সংযোজন str
বস্তু বা বিষয়বস্তু ধরণ পরিবর্তন করে a
নির্দেশ করে কোনো মান গ্রহণযোগ্য (স্বজ্ঞা সাথে সঞ্চালিত List[Any]
পর Any
থেকে আমদানি করা হয়েছে typing
)।
param_name : type
আপনার ফাংশন স্বাক্ষরের প্রতিটি প্যারামিটারের পরে ফাংশনে টীকাগুলি যুক্ত করা হয় -> type
এবং শেষ ফাংশন কোলনের আগে স্বরলিপিটি ব্যবহার করে একটি রিটার্ন টাইপ নির্দিষ্ট করা হয় ; সমস্ত টীকাগুলি __annotations__
একটি কার্যকরী অভিধান আকারে। ফাংশনের জন্য অ্যাট্রিবিউটে সংরক্ষণ করা হয়। তুচ্ছ উদাহরণ ব্যবহার করে (যার জন্য typing
মডিউল থেকে অতিরিক্ত ধরণের প্রয়োজন হয় না ):
def annotated(x: int, y: str) -> bool:
return x < y
annotated.__annotations__
অ্যাট্রিবিউট এখন নিম্নলিখিত মান রয়েছে:
{'y': <class 'str'>, 'return': <class 'bool'>, 'x': <class 'int'>}
যদি আমরা একটি সম্পূর্ণ নুবি, বা Py2.7
ধারণাগুলির সাথে আমরা পরিচিত এবং এর TypeError
তুলনায় লুকোচুরি সম্পর্কে অজানা annotated
থাকি তবে আমরা আরও একটি স্থিতিশীল চেক করতে পারি, ত্রুটিটি ধরতে পারি এবং আমাদের কিছুটা সমস্যা বাঁচাতে পারি:
(Python3)jimmi@jim: mypy typeHintsCode.py
typeFunction.py: note: In function "annotated":
typeFunction.py:2: error: Unsupported operand types for > ("str" and "int")
অন্যান্য বিষয়গুলির মধ্যে, অবৈধ যুক্তি দিয়ে ফাংশনটি কল করাও ধরা পড়বে:
annotated(20, 20)
# mypy complains:
typeHintsCode.py:4: error: Argument 2 to "annotated" has incompatible type "int"; expected "str"
এগুলিকে মূলত কোনও ব্যবহারের ক্ষেত্রে বাড়ানো যেতে পারে এবং ধরা পড়ে থাকা ত্রুটিগুলি বেসিক কল এবং ক্রিয়াকলাপের চেয়ে আরও বাড়ানো যায়। আপনি যে ধরণের জন্য যাচাই করতে পারেন তা সত্যিই নমনীয় এবং আমি কেবল এর সম্ভাবনার একটি ছোট্ট ছিঁচকেছি peak typing
মডিউল, পিইপি বা mypy
দস্তাবেজগুলির একটি চেহারা আপনাকে প্রদত্ত ক্ষমতাগুলির আরও বিস্তৃত ধারণা দেবে।
স্টাব ফাইল:
স্টাব ফাইল দুটি ভিন্ন ভিন্ন পারস্পরিক একচেটিয়া ক্ষেত্রে ব্যবহার করা যেতে পারে:
- আপনাকে এমন একটি মডিউল যাচাই করতে হবে যার জন্য আপনি সরাসরি ফাংশনের স্বাক্ষরগুলি পরিবর্তন করতে চান না
- আপনি মডিউল লিখতে এবং টাইপ-চেক করতে চান তবে অতিরিক্তভাবে টীকা থেকে টীকা পৃথক করতে চান।
স্টাব ফাইলগুলি (একটি এক্সটেনশান সহ .pyi
) হ'ল আপনি যে মডিউলটি তৈরি করতে / ব্যবহার করতে চান তার একটি টীকা দেওয়া ইন্টারফেস। এগুলিতে যে ফাংশনগুলি আপনি ফেলে দিতে চান তার শরীরের সাথে টাইপ-চেক করতে চান এমন ফাংশনের স্বাক্ষর রয়েছে। এটির অনুভূতি পেতে, নামের একটি মডিউলে তিনটি এলোমেলো ফাংশনগুলির একটি সেট দেওয়া হয়েছে randfunc.py
:
def message(s):
print(s)
def alterContents(myIterable):
return [i for i in myIterable if i % 2 == 0]
def combine(messageFunc, itFunc):
messageFunc("Printing the Iterable")
a = alterContents(range(1, 20))
return set(a)
আমরা একটি স্টাব ফাইল তৈরি করতে পারি randfunc.pyi
, যাতে আমরা এটি করতে চাইলে কিছু বিধিনিষেধ তৈরি করতে পারি। নেতিবাচকতাটি হ'ল স্টাব ছাড়াই উত্সটি দেখছেন এমন কোনটি কোথায় পাস করার কথা তা বোঝার চেষ্টা করার সময় সত্যিকার অর্থে সেই টীকাটি সহায়তা পাওয়া যাবে না।
যাইহোক, একটি স্টাব ফাইলের কাঠামো বেশ সরলতর: খালি দেহ ( pass
ভরা) সহ সমস্ত ফাংশন সংজ্ঞা যুক্ত করুন এবং আপনার প্রয়োজনীয়তার উপর ভিত্তি করে টীকা সরবরাহ করুন। এখানে, ধরে নেওয়া যাক আমরা কেবলমাত্র int
আমাদের ধারকগুলির জন্যই কাজ করতে চাই ।
# Stub for randfucn.py
from typing import Iterable, List, Set, Callable
def message(s: str) -> None: pass
def alterContents(myIterable: Iterable[int])-> List[int]: pass
def combine(
messageFunc: Callable[[str], Any],
itFunc: Callable[[Iterable[int]], List[int]]
)-> Set[int]: pass
combine
ফাংশন কেন আপনি কি অন্য কিছু ফাইলে টীকা ব্যবহার করতে চাইতে পারেন একটি ইঙ্গিত দেয়, তারা কিছু সময়ের কোড আপ বিশৃঙ্খল এবং (পাইথন জন্য বড় চল নেই) পাঠযোগ্যতা কমানো। আপনি অবশ্যই প্রকারের এলিয়াস ব্যবহার করতে পারেন তবে এটি কখনও কখনও এটির চেয়ে বেশি বিভ্রান্ত করে (তাই সেগুলি বুদ্ধিমানের সাথে ব্যবহার করুন)।
এটি আপনাকে পাইথনের টাইপ ইঙ্গিতগুলির প্রাথমিক ধারণাগুলির সাথে পরিচিত হতে হবে। যদিও টাইপ চেকারটি ব্যবহার করা হয়েছে
mypy
তা ধীরে ধীরে আপনার বেশিরভাগ পপ-আপ দেখা শুরু করা উচিত, কিছু অভ্যন্তরীণভাবে আইডিই ( পাইচার্ম ,) এবং অন্যদের স্ট্যান্ডার্ড পাইথন মডিউল হিসাবে। আমি চেষ্টা করব এবং নীচের তালিকায় অতিরিক্ত চেকার / সম্পর্কিত প্যাকেজগুলি যুক্ত করব এবং যখন আমি তাদের খুঁজে পাই (বা যদি প্রস্তাবিত হয়)।
আমার জানা চেকাররা :
- মাইপি : এখানে বর্ণিত।
- পাইটাইপ : গুগল দ্বারা, আমি যা সংগ্রহ করি তার থেকে আলাদা স্বরলিপি ব্যবহার করে, সম্ভবত এটির জন্য মূল্যবান।
সম্পর্কিত প্যাকেজ / প্রকল্পসমূহ :
- টাইপশেড: অফিসিয়াল পাইথন রেপো স্ট্যান্ডার্ড লাইব্রেরির জন্য স্টাব ফাইলগুলির একটি ভাণ্ডার হাউজিং।
typeshed
প্রকল্পের আসলে সেরা জায়গা কেমন টাইপ হিন্টিং হচ্ছে আপনার নিজস্ব একটি প্রকল্পে ব্যবহার করা যেতে পারে দেখতে সন্ধান করতে পারেন মধ্যে অন্যতম। একটি উদাহরণ হিসাবে আসুন নিতে এর dunders বর্গ সংশ্লিষ্ট মধ্যে ফাইল:__init__
Counter
.pyi
class Counter(Dict[_T, int], Generic[_T]):
@overload
def __init__(self) -> None: ...
@overload
def __init__(self, Mapping: Mapping[_T, int]) -> None: ...
@overload
def __init__(self, iterable: Iterable[_T]) -> None: ...
যেখানে _T = TypeVar('_T')
জেনেরিক ক্লাস সংজ্ঞায়িত করতে ব্যবহৃত হয় । জন্য Counter
বর্গ আমরা দেখতে পারি যে এটা হয়, তার সূচনাকারী মধ্যে কোন যুক্তি নিতে একটি একক পেতে পারেন Mapping
একটি কোনো ধরণ থেকে int
বা একটি নিতে Iterable
যেকোনো ধরনের।
বিজ্ঞপ্তি : একটি জিনিস আমি উল্লেখ করতে ভুলে গেছি তা হল typing
মডিউলটি অস্থায়ী ভিত্তিতে চালু করা হয়েছিল । পিইপি 411 থেকে :
একটি অস্থায়ী প্যাকেজটিতে "স্নাতক" কোনও "স্থিতিশীল" অবস্থায় পরিবর্তিত হওয়ার আগে এর এপিআই পরিবর্তিত হতে পারে। একদিকে, এই রাজ্যটি পাইথন বিতরণের আনুষ্ঠানিকভাবে অংশ হওয়ার সুবিধা দিয়ে প্যাকেজ সরবরাহ করে। অন্যদিকে, মূল বিকাশকারী দল স্পষ্টভাবে বলেছে যে প্যাকেজের এপিআইয়ের স্থিতিশীলতার বিষয়ে কোনও প্রতিশ্রুতি দেওয়া হয় না, যা পরবর্তী প্রকাশের জন্য পরিবর্তিত হতে পারে। যদিও এটি একটি অপ্রত্যাশিত ফলাফল হিসাবে বিবেচিত হয়, এই জাতীয় প্যাকেজগুলি এমনকি যদি এপিআই বা রক্ষণাবেক্ষণ সম্পর্কিত উদ্বেগগুলি সুপ্রতিষ্ঠিত প্রমাণিত হয় তবে অবচয় সময়কালে স্ট্যান্ডার্ড লাইব্রেরি থেকে সরানো যেতে পারে।
তাই এখানে এক চিমটি নুন দিয়ে জিনিসগুলি নিয়ে যান; আমি সন্দেহ করি এটি মুছে ফেলা হবে বা উল্লেখযোগ্য উপায়ে পরিবর্তন করা হবে তবে এটি কখনই জানতে পারে না।
** অন্য একটি বিষয় পুরোপুরি তবে টাইপ-ইঙ্গিতগুলির পরিধিতে বৈধ PEP 526
:: পরিবর্তনশীল টীকাগুলির জন্য সিনট্যাক্স হল একটি # type
নতুন সিনট্যাক্স প্রবর্তন করে মন্তব্যগুলিকে প্রতিস্থাপনের একটি প্রচেষ্টা যা ব্যবহারকারীদেরকে সাধারণ varname: type
বিবৃতিতে ভেরিয়েবলের ধরণের টীকায়িত করতে দেয় ।
পাইথন ৩.6-এ পরিবর্তনীয় টীকাগুলি কী কী দেখুন ? যেমন পূর্বে উল্লিখিত হয়েছে, এগুলির জন্য একটি ছোট পরিচয়ের জন্য।