चर एनोटेशन क्या हैं?


84

पायथन 3.6 रिलीज होने वाली है। PEP 494 - पायथन 3.6 रिलीज़ शेड्यूल दिसंबर के अंत का उल्लेख करता है, इसलिए मैं पायथन 3.6 में व्हाट्स न्यू के माध्यम से गया, यह देखने के लिए कि वे चर एनोटेशन का उल्लेख करते हैं :

पीईपी 484 ने फ़ंक्शन मापदंडों के प्रकार एनोटेशन, उर्फ ​​टाइप संकेत के लिए मानक पेश किया। यह पीईपी वर्ग चर और उदाहरण चर सहित प्रकारों की व्याख्या करने के लिए पायथन में वाक्यविन्यास जोड़ता है:

primes: List[int] = []

captain: str  # Note: no initial value!

class Starship:
     stats: Dict[str, int] = {}

फ़ंक्शन एनोटेशन के लिए के रूप में, पायथन दुभाषिया चर एनोटेशन के लिए किसी विशेष अर्थ को संलग्न नहीं करता है और केवल उन्हें __annotations__एक वर्ग या मॉड्यूल की विशेष विशेषता में संग्रहीत करता है । वैधानिक रूप से टाइप की गई भाषाओं में परिवर्तनशील घोषणाओं के विपरीत, एनोटेशन सिंटैक्स का लक्ष्य अमूर्त सिंटैक्स ट्री और __annotations__विशेषता के माध्यम से तीसरे पक्ष के उपकरण और पुस्तकालयों के लिए संरचित प्रकार मेटाडेटा को निर्दिष्ट करने का एक आसान तरीका प्रदान करना है ।

इसलिए मैंने जो पढ़ा है, वे पायथन 3.5 से आने वाले प्रकार के संकेतों का हिस्सा हैं, जो वर्णन किया गया है कि पायथन 3.5 में क्या हैं

मैं उदाहरण captain: strऔर class Starshipउदाहरण का पालन करता हूं , लेकिन पिछले एक के बारे में निश्चित नहीं हूं : कैसे primes: List[int] = []समझाता है? क्या यह एक खाली सूची को परिभाषित कर रहा है जो सिर्फ पूर्णांक की अनुमति देगा?


10
टाइप संकेत किसी भी प्रकार की जाँच नहीं करते हैं। primes: List[int] = []के रूप में सिर्फ एक खाली सूची है primes = []। अंतर यह है कि आप कर रहे हैं का दावा है कि primes करने के लिए है शामिल केवल intहै और 3 पार्टी अनुप्रयोगों अपने कार्यक्रम की जाँच इस दावे का सत्यापन टाइप सकता है, लेकिन जब आप किसी भी अजगर दुभाषिया सिर्फ लेखन के रूप में ही है कि में कोड को चलाने primes = [], और इस तरह कर रही है primes: List[int] = []; primes.append("string")अब भी है वैध।
बाकुरू

2
@ बकुरीउ हां, अच्छी बात है। जैसा कि जिम फासाराकिस-हिलियार्ड ने अपने जवाब में वर्णन किया है कि पायथन 3.5 में टाइप संकेत क्या हैं , क्यों संकेत टाइप करता हैप्रकार चेकर्स की मदद करता है, प्रलेखन में मदद करता है और आईडीई अधिक सटीक और मजबूत टूल विकसित करने में मदद करता हैपीईपी 526 से लिया गया - वैरिएंट एनोटेशन के लिए सिंटैक्स , पायथन एक गतिशील रूप से टाइप की गई भाषा रहेगी, और लेखकों को कभी भी सम्मेलन द्वारा टाइप संकेत अनिवार्य करने की कोई इच्छा नहीं है
फेडोरक्वी 'SO रोकना नुकसान पहुँचाता है'

1
क्या इससे आपके सवाल का जवाब मिलता है? पायथन 3.5 में टाइप संकेत क्या हैं?
AMC

जवाबों:


48

के बीच सब कुछ :और =एक प्रकार का संकेत है, इसलिए primesवास्तव में इसे परिभाषित किया गया है List[int], और शुरू में एक खाली सूची में सेट किया गया है (और statsशुरू में एक खाली शब्दकोश है, जिसे परिभाषित किया गया है Dict[str, int])।

List[int]और Dict[str, int]अगले सिंटैक्स का हिस्सा नहीं हैं, लेकिन ये पहले से ही Python 3.5 टाइपिंग संकेत PEP में परिभाषित किए गए थे। 3.6 पीईपी 526 - वैरिएबल एनोटेशंस प्रस्ताव के लिए सिंटैक्स केवल वाक्यविन्यास को वैरिएबल के समान संकेत संलग्न करने के लिए परिभाषित करता है; इससे पहले कि आप केवल टिप्पणियों (जैसे primes = [] # List[int]) के साथ चर संकेत टाइप कर सकते ।

दोनों Listऔर Dictकर रहे हैं जेनेरिक प्रकार, यह दर्शाता है कि आप विशिष्ट (ठोस) सामग्री के साथ एक सूची या शब्दकोश मानचित्रण है।

के लिए List, [...]सूची में प्रत्येक तत्व का प्रकार केवल एक 'तर्क' ( वाक्यविन्यास में तत्व ) है। के लिए Dict, पहला तर्क कुंजी प्रकार है, और दूसरा मान प्रकार है। तो सूची में सभी मान primesपूर्णांक हैं, और शब्दकोश में सभी कुंजी-मूल्य जोड़े जोड़े हैं, पूर्णांक के लिए तार मैपिंग।stats(str, int)

परिभाषाओं typing.Listऔर typing.Dictपरिभाषाओं को देखें , जेनरिक पर अनुभाग , साथ ही पीईपी 483 - प्रकार के संकेत का सिद्धांत

फ़ंक्शंस पर टाइप संकेत की तरह, उनका उपयोग वैकल्पिक है और एनोटेशन भी माना जाता है (बशर्ते कि उन्हें संलग्न करने के लिए एक ऑब्जेक्ट है, इसलिए मॉड्यूल में ग्लोबल्स और कक्षाओं पर विशेषताएँ, लेकिन फ़ंक्शन में स्थानीय नहीं) जिसे आप __annotations__विशेषता के माध्यम से आत्मनिरीक्षण कर सकते हैं । आप इन एनोटेशन के लिए मनमानी जानकारी संलग्न कर सकते हैं, आप कड़ाई से संकेत जानकारी तक सीमित नहीं हैं।

आप पूरा प्रस्ताव पढ़ना चाह सकते हैं ; इसमें नए सिंटैक्स के ऊपर और परे कुछ अतिरिक्त कार्यक्षमता शामिल है; यह निर्दिष्ट करता है कि जब इस तरह के एनोटेशन का मूल्यांकन किया जाता है, तो उन्हें कैसे आत्मनिरीक्षण करना है और उदाहरण के लिए, वर्ग विशेषता बनाम उदाहरण विशेषता के रूप में कुछ कैसे घोषित करना है।


1
क्या मैं टाइप संकेत को "मशीन-पठनीय" टिप्पणियों के रूप में मानता हूं, क्योंकि वे प्रभावित नहीं करते कि कोड कैसे चलता है (एक obj.__annotations__विशेषता को छोड़कर )?
1

2
@ आईबग: एनोटेशन मशीन से पढ़े जाने वाले कमेंट्स हैं, इनफॉफ़र है कि कमेंट वैसे भी मानव पठनीय एनोटेशन हैं। :-)
मार्टिन पीटर्स

59

चर एनोटेशन क्या हैं?

वैरिएबल एनोटेशन # typeटिप्पणियों से अगला चरण है , जैसा कि उन्हें परिभाषित किया गया था PEP 484; पीईपी 526 के संबंधित अनुभाग में इस परिवर्तन के पीछे तर्क को उजागर किया गया है

इसलिए, इस प्रकार के संकेत के बजाय:

primes = []  # type: List[int]

फॉर्म के असाइनमेंट के साथ सीधे टाइप करने की अनुमति देने के लिए नया सिंटैक्स पेश किया गया था :

primes: List[int] = []

जैसा कि @Martijn ने बताया, उपलब्ध सूची का उपयोग करके typingऔर इसे खाली सूची में आरंभ करके पूर्णांकों की सूची को दर्शाता है ।

क्या बदलाव लाता है?

शुरू किया गया पहला परिवर्तन नया वाक्यविन्यास था जो आपको एक प्रकार के साथ किसी नाम को एनोटेट करने की अनुमति देता है, या तो :वर्ण के बाद स्टैंडअलोन या वैकल्पिक रूप से एनोटेट करते हुए भी इसके लिए एक मान निर्दिष्ट करते हैं:

annotated_assignment_stmt ::=  augtarget ":" expression ["=" expression]

तो सवाल में उदाहरण:

   primes: List[int] = [ ]
#    ^        ^         ^
#  augtarget  |         |
#         expression    |
#                  expression (optionally initialize to empty list)

नए सिंटैक्स के साथ अतिरिक्त परिवर्तन भी पेश किए गए थे; मॉड्यूल और कक्षाओं में अब एक __annotations__विशेषता है ( पीईपी 3107 के बाद से फ़ंक्शन होता है - फ़ंक्शन एनोटेशन ) जिसमें मेटाडेटा टाइप जुड़ा हुआ है:

from typing import get_type_hints  # grabs __annotations__

अब __main__.__annotations__घोषित प्रकार हैं:

>>> from typing import List, get_type_hints
>>> primes: List[int] = []
>>> captain: str
>>> import __main__
>>> get_type_hints(__main__)
{'primes': typing.List<~T>[int]}

captainवर्तमान में इसके माध्यम से नहीं दिखाई देगा get_type_hintsक्योंकि get_type_hintsकेवल एक प्रकार के रिटर्न को मॉड्यूल पर एक्सेस किया जा सकता है; अर्थात, इसे पहले एक मूल्य की आवश्यकता है:

>>> captain = "Picard"
>>> get_type_hints(__main__)
{'primes': typing.List<~T>[int], 'captain': <class 'str'>}

उपयोग print(__annotations__)करना दिखाएगा 'captain': <class 'str'>लेकिन आपको वास्तव में __annotations__सीधे पहुंच नहीं होना चाहिए ।

इसी प्रकार, कक्षाओं के लिए:

>>> get_type_hints(Starship)
ChainMap({'stats': typing.Dict<~KT, ~VT>[str, int]}, {})

जहाँ a ChainMapका उपयोग किसी दिए गए वर्ग (पहली मानचित्रण में स्थित) के लिए एनोटेशन को हथियाने के लिए किया जाता है और बेस क्लास में परिभाषित सभी एनोटेशन इसके mro(इसके परिणामस्वरूप {}ऑब्जेक्ट के लिए मैपिंग ) में पाए जाते हैं ।

नए सिंटैक्स के साथ, ClassVarवर्ग चर को निरूपित करने के लिए एक नया प्रकार जोड़ा गया है। हाँ, statsआपके उदाहरण में वास्तव में एक उदाहरण चर है , नहीं ClassVar

क्या मुझे इसका उपयोग करने के लिए मजबूर किया जाएगा?

जैसा कि इसके प्रकार के संकेत के साथ PEP 484, ये पूरी तरह से वैकल्पिक हैं और प्रकार के चेकिंग टूल के लिए मुख्य उपयोग के हैं (और इस जानकारी के आधार पर आप जो भी निर्माण कर सकते हैं)। यह अनंतिम होना है जब पाइथन 3.6 का स्थिर संस्करण जारी किया जाता है तो भविष्य में छोटे ट्वीक्स जोड़े जा सकते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.