मुख्य सामग्री पर जाएँ

Type Checking in Python Tutorial

टाइप चेकिंग, विभिन्न भाषाओं में टाइप सिस्टम के प्रकार, डक टाइपिंग और टाइप हिन्टिंग के बारे में जानें।
· 7 मि॰ पढ़ें

AI के साथ खोजें

Python में इसका अपना Interpreter टाइप चेकिंग करता है। चूंकि Python एक डायनेमिक भाषा है, यह ऑब्जेक्ट्स के प्रकार को लागू करने के लिए उपयोगकर्ता को बाध्य नहीं करती, जिससे बग आ सकते हैं और त्रुटियाँ ढूंढना कठिन हो सकता है। इसे दूर करने के लिए, Python को विभिन्न अन्य टूल्स के साथ इस्तेमाल किया जा सकता है और अपने Duck Typing के साथ स्थिर (static) टाइप चेकिंग की विशेषताएँ लागू की जा सकती हैं।

विभिन्न प्रोग्रामिंग भाषाएँ दो अलग-अलग प्रकार के टाइप सिस्टम का पालन करती हैं, जो नीचे दिए गए हैं।

    1. स्टैटिक टाइप्ड लैंग्वेज
    2. डायनेमिक टाइप्ड लैंग्वेज

स्टैटिक टाइप्ड लैंग्वेज

वैरिएबल के प्रकार की जाँच कंपाइल-टाइम पर होती है। साथ ही, भाषा का टाइप सिस्टम वैरिएबल के उपयोग से पहले उसके 'data-type' को स्पष्ट रूप से घोषित करने के लिए बाध्य करता है। जो प्रोग्रामिंग भाषाएँ स्टैटिकली टाइप्ड हैं, वे हैं: Scala, Java, C++ आदि।
उदाहरण के लिए, Scala में String की घोषणा नीचे दी गई है:
var myCar:String = "Mercedes";
ऊपर दिया गया कोड दिखाता है कि वैरिएबल 'myCar' को स्पष्ट रूप से 'String' डेटा-टाइप के रूप में 'Mercedes' मान के साथ घोषित किया गया है।

डायनेमिक टाइप्ड लैंग्वेज

वैरिएबल के प्रकार की जाँच रन-टाइम पर होती है। साथ ही, भाषा का टाइप सिस्टम वैरिएबल के उपयोग से पहले उसके 'data-type' को स्पष्ट रूप से घोषित करने के लिए बाध्य नहीं करता। जो प्रोग्रामिंग भाषाएँ डायनेमिकली टाइप्ड हैं, वे हैं: Python, Javascript, Ruby आदि।
उदाहरण के लिए, Python में String नीचे की तरह परिभाषित है:
myCar = "Mercedes"
ऊपर दिया गया कोड दिखाता है कि वैरिएबल 'myCar' को स्पष्ट रूप से घोषित करने की आवश्यकता नहीं है।

Python में 'type()' और 'isinstance()'

वैरिएबल के प्रकार Python के 'type()' से जाने जा सकते हैं। 'type()' का उपयोग रनटाइम पर डिबगिंग के उद्देश्य से किया जा सकता है ताकि प्रोग्राम में सटीक वैरिएबल प्रकारों की पहचान की जा सके। नीचे दिए उदाहरण में कुछ वैरिएबल्स का प्रकार देखते हैं।

my_var = 12
print(type(my_var))

ऊपर दिया गया कोड 'int' आउटपुट देगा। क्योंकि वैरिएबल का डेटा टाइप integer है, जहाँ 'type()' उसकी पहचान करने में काम आता है।

Python का 'insinstance('obj','class')' यह जानने के लिए उपयोग किया जा सकता है कि 'obj' जो कि ऑब्जेक्ट है, वह किसी क्लास का इंस्टेंस है या नहीं। लौटाया गया आउटपुट बूलियन होता है जो True या False में से एक होता है।

my_var = "Hello"
print(isinstance(my_var,str))

ऊपर दिया गया कोड True आउटपुट देगा। क्योंकि वैरिएबल का डेटा टाइप string है, जहाँ 'isinstance()' उसकी पहचान करने में काम आता है।

Python में Duck typing

Python में एक लोकप्रिय सिद्धांत है, "यदि वह बतख जैसा दिखता है, बतख की तरह तैरता है, और बतख की तरह आवाज़ करता है, तो संभवतः वह बतख ही है।" सरल शब्दों में, सिद्धांत कहता है कि ऑब्जेक्ट या क्लास के प्रकार मायने नहीं रखते, बल्कि यदि ऑब्जेक्ट में समान मेथड्स और प्रॉपर्टीज़ हों, तो उस ऑब्जेक्ट का किसी विशेष उद्देश्य के लिए उपयोग किया जा सकता है।
उपर्युक्त कथन को और स्पष्ट करने के लिए एक उदाहरण देखते हैं।

नीचे दिए गए उदाहरण में दो क्लास हैं 'Duck' और 'Human'। Duck क्लास में 'quack' और 'fly' नामक मेथड्स हैं। इसी प्रकार, Human एक क्लास है जिसमें अपने 'quack' और 'fly' मेथड्स हैं। Duck और Human अलग क्लास हैं और अलग ऑब्जेक्ट/टाइप भी। फिर भी, Human में Duck के समान 'fly' और 'quack' मेथड्स हैं। एक 'fly_quack' नाम की मेथड भी है, जो इसलिए 'Duck' से अधिक मेल खाती है क्योंकि यह उड़ और 'quack' कर सकती है।

class Duck:
    def quack(self):
        print('Quack')
    def fly(self):
        print('Flap')
class Human:
    def quack(self):
        print('Trying to Quack like a duck')
    def fly(self):
        print('Spreading my arm to flap like a duck')      
def fly_quack(thing):
    thing.quack()
    thing.fly()

'Duck' का एक इंस्टेंस du बनाते हैं और उसे फंक्शन 'fly_quack(du)' में पास करते हैं। इसी तरह, Human का इंस्टेंस 'h' बनाते हैं और उसे फंक्शन 'fly_quack(h)' में पास करते हैं।

du = Duck()
fly_quack(du)
h = Human()
fly_quack(h)

ऊपर दिए गए कोड का आउटपुट नीचे है:

Trying to Quack like a duck
Spreading my arm to flap like a duck
Quack
Flap

चूँकि 'Human' क्लास, 'Duck' से अलग क्लास है, फिर भी Python मानव के लिए भी 'fly_quack' फंक्शन को कॉल करता है। यद्यपि ऑब्जेक्ट टाइप अलग थे, क्योंकि 'Human' में 'quack' और 'fly' जैसे समान मेथड्स हैं, यह अपेक्षित मेथड प्रदान कर देता है।

Type Hint और mypy

Python जैसी डायनेमिक टाइप्ड भाषा का एक शक्तिशाली पहलू यह है कि यह कोड को अधिक सुलभ और पठनीय बनाती है, लेकिन इसके कुछ दुष्प्रभाव भी हैं। इनमें से एक कमी रन-टाइम त्रुटियों का पता लगाना है, क्योंकि Python वैरिएबल के प्रकार को लागू नहीं करती, या यह डायनेमिक टाइप्ड भाषा है। इसका परिणाम त्रुटियों और बग्स के रूप में हो सकता है, जिन्हें तब ढूंढना कठिन होता है जब कोड का आकार बड़ा होता जाता है।

Python ने संस्करण 3.5 से Type Hints लागू किए हैं। पुराने संस्करणों में TypeHints की कार्यक्षमता समर्थित नहीं हो सकती।

आप बिना टाइप हिन्टिंग और mypy के एक सरल उदाहरण देखेंगे।

नीचे दिया गया फंक्शन एक integer मान के घटाव के लिए है, जो दो integers घटाता है और मान लौटाता है।

def sub_this(x,y):
    return 'Subtraction'
print(sub_this(8,'hello'))

यहाँ ऊपर दिया गया फंक्शन दो integers 'x' और 'y' स्वीकार करना चाहिए, परंतु चूँकि नियम लागू नहीं हैं, यह किसी भी डेटा टाइप को ले सकता है। साथ ही, रिटर्न वैल्यू कुछ भी हो सकती है; यहाँ 'str' मान ('Subtraction') लौटाया जा रहा है, जबकि अपेक्षित 'int' था।

अब इसी प्रोग्राम का समान कार्यान्वयन टाइप हिन्ट्स और 'mypy' का उपयोग करके देखते हैं, जो स्टैटिक टाइप चेकिंग लागू करने में मदद कर सकता है और प्रोग्राम में त्रुटियों व बग्स को काफी आसानी से कम कर सकता है।

'mypy' एक Python मॉड्यूल है जो स्टैटिक टाइप चेकिंग में मदद करता है। यह Python के अपने डायनेमिक चेकिंग या डक टाइपिंग को टाइप-हिन्टिंग के साथ इस्तेमाल करता है।

आपको 'mypy' पैकेज इंस्टॉल करना होगा
pip install mypy

आप अपनी लोकल मशीन पर 'mypy_example.py' नाम की फाइल बना सकते हैं और नीचे दिया गया कोड टाइप कर सकते हैं।
नीचे दिया गया कोड एक सरल प्रोग्राम है जो पैरामीटर में दो integers इनपुट के रूप में स्वीकार करता है, और '->' के बाद लौटाया गया डेटा टाइप दिखाता है, जो 'int' है। हालाँकि, फंक्शन को int लौटाना चाहिए, लेकिन string 'Subtracted two integers' लौटाई जा रही है।

def sub_this(x:int,y:int) -> int:
    return 'Subtracted two integers'
print(sub_this(8,4))

उपरोक्त कोड को टर्मिनल में निम्न कमांड से चलाएँ।

mypy mypy_example.py

फिर त्रुटि दिखेगी, जो संकेत देगी कि अप्रत्याशित रिटर्न वैल्यू "str" मिली है और इसे "int" से ठीक किया जाना चाहिए।

Error message

रिटर्न टाइप को दो integers के घटाव के रूप में बदलते हैं ताकि integer मान लौटे।

def sub_this(x:int,y:int) -> int:
    return x - y
print(sub_this(8,4))

Success message

ऊपर के परिणाम दिखाते हैं कि सफलता संदेश प्रिंट हुआ और कोई समस्या नहीं मिली।

बधाई

बधाई हो, आप इस ट्यूटोरियल के अंत तक पहुँच गए हैं!

इस ट्यूटोरियल में, आपने टाइप चेकिंग, विभिन्न भाषाओं में टाइप सिस्टम के प्रकार, Python के तरीकों ('type()' और 'isinstance()') के साथ-साथ Python में डक टाइपिंग और 'mypy' के साथ टाइप हिन्टिंग के बारे में सीखा।

यदि आप Python के बारे में और सीखना चाहते हैं, तो DataCamp का Software Engineering for Data Scientists in Python कोर्स करें।

संदर्भ:

  1. Corey का Duck Typing पर YouTube वीडियो

विषय