यह अजीब औपनिवेशिक व्यवहार क्या कर रहा है?


104

मैं पाइथन 3.6.1 का उपयोग कर रहा हूं, और मैं कुछ बहुत ही अजीब आया हूं। मेरे पास एक सरल शब्दकोश असाइनमेंट टाइपो था जिसे खोजने में मुझे लंबा समय लगा।

context = {}
context["a"]: 2
print(context)

उत्पादन

{}

कोड context["a"]: 2क्या कर रहा है? SyntaxErrorजब यह IMO होना चाहिए तो यह नहीं बढ़ा । पहले मुझे लगा कि यह एक स्लाइस बना रहा है। हालाँकि, टाइपिंग repr(context["a"]: 2)एक उठाता है SyntaxError। मैंने context["a"]: 2कंसोल में टाइप किया और कंसोल ने कुछ भी प्रिंट नहीं किया। मैंने सोचा कि शायद यह लौट आए None, लेकिन मुझे यकीन नहीं है।

मैंने यह भी सोचा है कि अगर यह कथन एक एकल पंक्ति हो सकता है, लेकिन यह सही वाक्यविन्यास भी नहीं होना चाहिए।

इसके अतिरिक्त, context["a"]एक उठाना चाहिए KeyError।

मैं हैरान हूं। क्या हो रहा है?


2
पहले से ही इस सवाल में एक दम है और यह बहुत स्पष्ट है कि यह पायथन नौसिखियों के लिए भ्रामक है। मुझे लगता है कि यह सबसे बुरा है अगर पायथन आपकी एकमात्र भाषा है, जहां टाइपिंग से पहले हिंटिंग और चर परिभाषा सामान्य रूप से विदेशी लग सकती है। मैं कल्पना करता हूं कि त्रुटि उठाना असंभव है क्योंकि यह व्यवहार जानबूझकर और कभी-कभी उपयोगी है जैसा कि पीईपी 526 में बताया गया है, और आप संगतता को तोड़ना नहीं चाहते हैं। हालांकि, मुझे आश्चर्य है कि अगर पायथन देव कुछ मामलों के लिए एक उपयोगी चेतावनी संदेश जोड़ने पर विचार करेंगे।
— क्रिस_लैंड्स

1
क्या इससे आपके सवाल का जवाब मिलता है? पायथन 3.6 में चर एनोटेशन क्या हैं?
— जॉर्जी

जवाबों:


98

आपने गलती से एक सही ढंग से सही चर एनोटेशन लिखा है । उस सुविधा को पायथन 3.6 में पेश किया गया था ( पीईपी 526 देखें )।

यद्यपि एक चर एनोटेशन को एनोटेट असाइनमेंट के हिस्से के रूप में पार्स किया जाता है , असाइनमेंट स्टेटमेंट वैकल्पिक है :

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

इस प्रकार, में context["a"]: 2

  • context["a"] एनोटेशन लक्ष्य है
  • 2 एनोटेशन ही है
  • context["a"] छोड़ दिया गया है

PEP कहता है कि "एनोटेशन का लक्ष्य किसी भी वैध एकल असाइनमेंट का लक्ष्य हो सकता है, कम से कम सिंटैक्टिक रूप से (यह उस प्रकार के चेकर पर निर्भर है कि वह क्या करे)" , जिसका अर्थ है कि कुंजी को अस्तित्व में होने की आवश्यकता नहीं है एनोटेट (इसलिए नहीं KeyError)। यहाँ मूल PEP से एक उदाहरण है:

d = {}
d['a']: int = 0  # Annotates d['a'] with int.
d['b']: int      # Annotates d['b'] with int.

आम तौर पर, एनोटेशन अभिव्यक्ति को पायथन प्रकार का मूल्यांकन करना चाहिए - एनोटेशन के सभी मुख्य उपयोग के बाद टाइप हिंटिंग है, लेकिन इसे लागू नहीं किया गया है। एनोटेशन परिणाम के प्रकार या मूल्य की परवाह किए बिना किसी भी मान्य पायथन अभिव्यक्ति हो सकता है ।

जैसा कि आप देख सकते हैं, इस समय प्रकार के संकेत बहुत अनुज्ञेय और शायद ही कभी उपयोगी होते हैं, जब तक कि आपके पास स्थैतिक प्रकार के चेकर जैसे कि मैपी न हो ।


12
क्या इसके लिए =असाइनमेंट ऑपरेटर की आवश्यकता नहीं होनी चाहिए ? कुंजी मौजूद नहीं है। यह सिर्फ मुझे गलत लगता है।
— जस्टेंगल

1
इस मामले में, : है असाइनमेंट ऑपरेटर। हम सिर्फ एक प्रकार का एनोटेशन "असाइन" कर रहे हैं, कुंजी नहीं। मुझे संदेह है कि इसकी अनुमति देने के लिए कोई कारण नहीं है, बस एक अनपेक्षित पक्ष एनोटेशन सिंटैक्स को जोड़ने का प्रभाव है।
— चेपनर

1
@chepner ऐसा लगता है कि यह कोई साइड-इफेक्ट नहीं है। यह वही है जो इसी PEP को करने के लिए डिज़ाइन किया गया था।
— Ma0

6
यह अजीब है कि यह आपको एक ऐसे लक्ष्य की व्याख्या करने की अनुमति देगा जो अभी तक परिभाषित नहीं किया गया है। अगर मेरी पहली लाइन है x: strऔर उसके तुरंत बाद type(x), दुभाषिया एक बढ़ा देगा NameError। IMO सिंटैक्स को लागू करना चाहिए वस्तु को पूर्व-परिभाषित किया गया है, या मौके पर परिभाषित किया गया है। यह सिर्फ भ्रम का परिचय देता है।
— r.ook

2
@ इलहैंड्स यह उद्देश्य को हरा देता है। होने x = 'i am a string'से पहले x: strबनाता है अनावश्यक सीरियल में .. यह सब पर जोड़ दिया गया है नहीं करना चाहिए। यह टिप्पणी के रूप में ठीक था; मैं कभी नहीं दिखाता कि यह एक तरह से या दूसरे का उपयोग करता है।
— Ma0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.