अन्य उत्तरों ने बत्तख टाइपिंग और tzot द्वारा सरल उत्तर की व्याख्या करने में अच्छा काम किया है :
अजगर के पास अन्य भाषाओं की तरह चर नहीं होते हैं, जहां चर का एक प्रकार और एक मूल्य होता है; इसमें वस्तुओं को इंगित करने वाले नाम हैं, जो उनके प्रकार को जानते हैं।
हालांकि , 2010 के बाद से एक दिलचस्प बात बदल गई है (जब सवाल पहले पूछा गया था), अर्थात् पीईपी 3107 का कार्यान्वयन (पायथन 3 में लागू)। अब आप वास्तव में एक पैरामीटर के प्रकार और फ़ंक्शन के रिटर्न प्रकार को इस तरह निर्दिष्ट कर सकते हैं:
def pick(l: list, index: int) -> int:
return l[index]
हम यहां देख सकते हैं कि pick
2 पैरामीटर, एक सूची l
और एक पूर्णांक लेता हैindex
। इसे एक पूर्णांक भी वापस करना चाहिए।
इसलिए यहां यह निहित है कि l
पूर्णांकों की एक सूची है जिसे हम बिना अधिक प्रयास के देख सकते हैं, लेकिन अधिक जटिल कार्यों के लिए यह थोड़ा भ्रमित हो सकता है कि सूची में क्या होना चाहिए। हम भी चाहते हैं कि डिफ़ॉल्ट मान index
0 हो। इसे हल करने के लिए आप pick
इसके बजाय इस तरह लिखना पसंद कर सकते हैं :
def pick(l: "list of ints", index: int = 0) -> int:
return l[index]
ध्यान दें कि अब हम एक स्ट्रिंग में टाइप के रूप में डालते हैं l
, जो कि वाक्यात्मक रूप से अनुमत है, लेकिन यह प्रोग्रामेटिक रूप से पार्स करने के लिए अच्छा नहीं है (जो हम बाद में वापस आएंगे)।
यह ध्यान रखना महत्वपूर्ण है कि TypeError
यदि आप फ्लोट पास करते हैं तो पायथन को नहीं उठाया जाएगा index
, इसका कारण पायथन के डिजाइन दर्शन में मुख्य बिंदुओं में से एक है: "हम यहाँ सभी वयस्कों की सहमति दे रहे हैं" , जिसका अर्थ है कि आपसे उम्मीद की जाती है इस बात से अवगत रहें कि आप एक समारोह में क्या कर सकते हैं और क्या नहीं। यदि आप वास्तव में ऐसा कोड लिखना चाहते हैं जो TypeErrors फेंकता है, तो आप isinstance
फ़ंक्शन का उपयोग यह जांचने के लिए कर सकते हैं कि पारित तर्क उचित प्रकार का है या इस तरह का एक उपवर्ग:
def pick(l: list, index: int = 0) -> int:
if not isinstance(l, list):
raise TypeError
return l[index]
इस पर अधिक कि आपको शायद ही ऐसा क्यों करना चाहिए और इसके बजाय आपको क्या करना चाहिए, इसके बारे में अगले भाग और टिप्पणियों में बात की गई है।
PEP 3107 न केवल कोड पठनीयता में सुधार करता है, बल्कि इसके कई फिटिंग उपयोग के मामले भी हैं जिन्हें आप यहाँ पढ़ सकते हैं ।
PEP 484 की शुरूआत के साथ Python 3.5 में टाइप एनोटेशन पर बहुत अधिक ध्यान दिया गया जो टाइप संकेत के लिए एक मानक मॉड्यूल का परिचय देता है।
ये प्रकार के संकेत टाइप चेकर mypy ( GitHub ) से आए थे , जो अब PEP 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
, लेकिन यह पाठक के लिए एक अभ्यास के रूप में छोड़ दिया गया है क्योंकि मेरा मानना है कि मैं पहले से ही टाइपिंग द्वारा सक्षम अद्भुत नई सुविधाओं के बारे में बहुत अधिक जानकारी के साथ अपना जवाब भर चुका हूं।
पहले जब एक उदाहरण के लिए स्फिंक्स के साथ पाइथन कोड का दस्तावेजीकरण किया गया था , तो उपरोक्त कार्यक्षमता में से कुछ को इस तरह से प्रारूपित लेखन द्वारा प्राप्त किया जा सकता है:
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]
जैसा कि आप देख सकते हैं, यह कई अतिरिक्त लाइनें लेता है (सटीक संख्या इस बात पर निर्भर करती है कि आप कितना स्पष्ट होना चाहते हैं और आप अपने डॉकस्ट्रिंग को कैसे प्रारूपित करते हैं)। लेकिन अब यह आपके लिए स्पष्ट होना चाहिए कि PEP 3107 एक विकल्प प्रदान करता है जो कई (सभी?) तरीकों से बेहतर है। यह पीईपी 484 के साथ संयोजन में विशेष रूप से सच है , जैसा कि हमने देखा है, एक मानक मॉड्यूल प्रदान करता है जो इन प्रकार के संकेत / एनोटेशन के लिए एक वाक्यविन्यास को परिभाषित करता है जिसे इस तरह से इस्तेमाल किया जा सकता है कि यह अस्पष्ट और सटीक है लेकिन अभी तक लचीला है, के लिए बना रहा है। शक्तिशाली संयोजन।
मेरी निजी राय में, यह पायथन में अब तक की सबसे बड़ी विशेषताओं में से एक है। मैं लोगों को इसकी शक्ति का उपयोग शुरू करने के लिए इंतजार नहीं कर सकता। लंबे उत्तर के लिए क्षमा करें, लेकिन यह तब होता है जब मैं उत्तेजित हो जाता हूं।
पायथन कोड का एक उदाहरण जो भारी रूप से टाइपिंग का उपयोग करता है यहां पाया जा सकता है ।