2016-12-28 9 views
24

मैंने देखा कि पायथन 3.5 और पायथन 3.6 स्थिर प्रकार की जांच के बारे में बहुत सी विशेषताएं जोड़ते हैं, इसलिए मैंने निम्न कोड (पायथन 3.6, स्थिर संस्करण में) के साथ प्रयास किया।पायथन 3.6 में टाइप संकेतों का उपयोग कैसे करें?

from typing import List 

a: List[str] = [] 
a.append('a') 
a.append(1) 
print(a) 

क्या मुझे हैरान कर दिया था कि, अजगर मुझे, कोई त्रुटि या चेतावनी नहीं दी थी, हालांकि 1 एक list जो केवल तार को शामिल करना चाहिए के साथ जोड़ दिया गया था। Pycharm ने टाइप त्रुटि का पता लगाया और मुझे इसके बारे में एक चेतावनी दी, लेकिन यह स्पष्ट नहीं था और यह आउटपुट कंसोल में नहीं दिखाया गया था, मुझे कभी डर था कि कभी-कभी मुझे याद आती है। मुझे निम्नलिखित प्रभाव चाहिए:

  1. यदि यह स्पष्ट है कि मैंने ऊपर दिखाए गए गलत प्रकार का उपयोग किया है, तो चेतावनी या त्रुटि फेंक दें।
  2. यदि संकलक विश्वसनीय रूप से जांच नहीं कर सका कि मेरे द्वारा उपयोग किए जाने वाले प्रकार सही या गलत थे, तो इसे अनदेखा करें।

क्या यह संभव है? हो सकता है कि mypy ऐसा कर सके, लेकिन मैं mypy में उपयोग की गई टिप्पणी-शैली (# type List[str]) की बजाय पायथन-3.6-शैली प्रकार की जांच (जैसे a: List[str]) का उपयोग करना पसंद करूंगा। और अगर मैं ऊपर बताए गए दो बिंदुओं को प्राप्त करने के लिए देशी पायथन 3.6 में एक स्विच है तो मैं उत्सुक हूं।

+0

mypy पहले ही पाइथन 3.6 परिवर्तनीय एनोटेशन का समर्थन करता है। – user2357112

+0

डुप्लिकेट नहीं होने पर प्रासंगिक: [पायथन 3.5 में टाइप संकेत क्या हैं] (http://stackoverflow.com/questions/32557920/what-are-type-hints-in-python-3-5/32558710#32558710) और [ पायथन 3.6 में परिवर्तनीय एनोटेशन क्या हैं?] (Http://stackoverflow.com/questions/39971929/what-are-variable-annotations-in-python-3-6?noredirect=1&lq=1) –

+0

इसे छोटा रखने के लिए: टाइप एनोटेशन टाइपिंग लागू करने के लिए नहीं हैं। भाषा गतिशील रूप से टाइप की जा रही है। – jsbueno

उत्तर

12

Is that possible? Maybe mypy could do it, but I'd prefer to use Python-3.6-style type checking (like a: List[str]) instead of the comment-style (like # type List[str]) used in mypy. And I'm curious if there's a switch in native python 3.6 to achieve the two points I said above.

कोई रास्ता नहीं है कि पाइथन आपके लिए ऐसा करेगा; टाइपिंग जांचने के लिए mypy का उपयोग कर सकते हैं (और पीईसीएचआरएमएस निर्मित चेकर को भी ऐसा करना चाहिए)। इसके अलावा, mypy भी को प्रतिबंधित नहीं करता है, आप केवल # type List[str] टिप्पणियां टाइप करने के लिए, आप चरम एनोटेशन का उपयोग कर पाइथन 3.6 में करते हैं, इसलिए a: List[str] समान रूप से अच्छी तरह से काम करता है।

mypy के साथ के रूप में है, क्योंकि रिहाई ताजा है, तो आप typed_ast स्थापित करने और --fast-parser और --python-version 3.6as documented in mypy's docs साथ mypy पर अमल करने की आवश्यकता होगी।यह शायद जल्द ही बदल जाएगा लेकिन अभी के लिए आप इसे सुचारू रूप से चलाने

अद्यतन पाने के लिए उन्हें आवश्यकता होगी:--fast-parser और --python-version 3.6 अब आवश्यक नहीं हैं।

ऐसा करने के बाद, मायपी आपके a: List[str] पर दूसरे ऑपरेशन की असंगतता का पता लगाता है। मान लीजिए कि आपकी फ़ाइल बयानों के साथ tp_check.py कहा जाता है दो:

from typing import List 

a: List[str] = [] 
a.append('a') 
a.append(1) 
print(a) 

ऊपर उल्लिखित तर्क के साथ mypy चल रहा है (यदि आप पहली चाहिए pip install -U typed_ast):

python -m mypy --fast-parser --python-version 3.6 tp_check.py 

कैच त्रुटि:

tp_check.py:5: error: Argument 1 to "append" of "list" has incompatible type "int"; expected "str" 

के रूप में उल्लेख किया पाइथन,के साथ संकेत देने पर कई अन्य उत्तरों में 210 और PyCharm एस 'टाइप-चेकर्स सत्यापन कर रहे हैं, पायथन स्वयं नहीं। पाइथन वर्तमान में इस जानकारी का उपयोग नहीं करता है, यह केवल इसे मेटाडेटा के रूप में संग्रहीत करता है और निष्पादन के दौरान इसे अनदेखा करता है।

19

टाइप संकेतों को पूरी तरह से पाइथन रनटाइम द्वारा अनदेखा किया जाना है, और केवल तीसरे पक्ष के उपकरण जैसे माईपी और पिचर्म के एकीकृत चेकर द्वारा जांच की जाती है। ऐसे कई कम ज्ञात तृतीय पक्ष टूल भी हैं जो टाइप एनोटेशन का उपयोग करके संकलन समय या रनटाइम पर टाइपशेकिंग करते हैं, लेकिन अधिकांश लोग मायपी या पिचर्म के एकीकृत चेकर AFAIK का उपयोग करते हैं। , PEP 484 की 'गैर लक्ष्यों' अनुभाग (जो प्रकार एनोटेशन शुरू की) और PEP 526 (जो चर एनोटेशन शुरू) देखते हैं -

वास्तव में, मैं वास्तव में संदेह है कि typechecking कभी foreseable भविष्य में उचित अजगर में एकीकृत किया जाएगा साथ ही Guido की टिप्पणियां here

मैं व्यक्तिगत रूप से पाइथन के साथ अधिक दृढ़ता से एकीकृत होने के प्रकार से जांच कर खुश हूं, लेकिन ऐसा लगता है कि बड़े पैमाने पर पाइथन समुदाय तैयार नहीं है या इस तरह के बदलाव के लिए तैयार है।

mypy के नवीनतम संस्करण को पाइथन 3.6 परिवर्तनीय एनोटेशन सिंटैक्स और टिप्पणी-शैली वाक्यविन्यास दोनों को समझना चाहिए। वास्तव में, वैरिएबल एनोटेशन मूल रूप से गिडो के विचार को पहली जगह में थे (गिडो वर्तमान में माई टीम का हिस्सा है) - मूल रूप से, मैपी में टाइप एनोटेशन के लिए समर्थन और पायथन में बहुत अधिक विकसित किया गया था।

5

पायथन में एनोटेशन टाइप करें टाइप-लागू करने के लिए नहीं हैं। रनटाइम स्थैतिक-प्रकार निर्भरता से जुड़ी कुछ भी मतलब है कि परिवर्तन इतने मौलिक हैं कि परिणामस्वरूप भाषा "पायथन" को जारी रखने के लिए यह भी समझ में नहीं आता है।

ध्यान दें कि पाइथन की गतिशील प्रकृति रनटाइम प्रकार की जांच करने के लिए शुद्ध-पायथन कोड का उपयोग करके बाह्य उपकरण बनाने के लिए अनुमति देती है। यह कार्यक्रम को धीरे-धीरे चलाएगा, लेकिन शायद यह कुछ परीक्षण श्रेणियों के लिए उपयुक्त है।

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

प्रकृति द्वारा स्वैच्छिक रूप से टाइप किए गए काम अलग-अलग तरीके से बोली जाती हैं: रन टाइम पर प्रयास किए जाने पर संचालन को ऑब्जेक्ट्स पर उपलब्ध होना चाहिए। संकलन चरण में, कंपाइलर सभी जगहों पर उपयुक्त वस्तुओं के लिए रिक्त स्थान और स्लॉट बनाता है - और, गैर-अनुरूप टाइपिंग पर, संकलन को तोड़ देता है।

पायथन की टाइपकेकिंग किसी भी उपकरण को वास्तव में ऐसा करने की अनुमति देती है: वास्तव में एप्लिकेशन को चलाने से पहले एक चरण में तोड़ने और चेतावनी देने के लिए (लेकिन स्वयं संकलन से स्वतंत्र)। लेकिन भाषा की प्रकृति को वास्तव में रनटाइम में अनुपालन करने के लिए वस्तुओं की आवश्यकता नहीं हो सकती है - और टाइपिंग और संकलन चरण में तोड़ने से कृत्रिम कृत्रिम होगा।

हालांकि, कोई उम्मीद कर सकता है कि पाइथन के भविष्य के संस्करण पाइथन रनटाइम पर संकलन-समय टाइपशेकिंग को अनदेखा कर सकते हैं - अधिकतर संभावित और वैकल्पिक कमांड लाइन स्विच। (मुझे नहीं लगता कि यह कभी भी डिफ़ॉल्ट होगा - कम से कम बिल्ड को तोड़ना नहीं - शायद इसे चेतावनियां उत्सर्जित करने के लिए डिफ़ॉल्ट बनाया जा सकता है)

तो, पायथन को रनटाइम पर स्थैतिक प्रकार की जांच की आवश्यकता नहीं है क्योंकि यह बंद हो जाएगा पायथन होने के नाते। लेकिन कम से कम एक भाषा मौजूद है जो गतिशील वस्तुओं और स्थैतिक टाइपिंग - साइथन भाषा दोनों का उपयोग करती है, जो अभ्यास में पाइथन सुपरसेट के रूप में काम करती है। वास्तविक प्रकार-घोषित होने के लिए नए टाइप-संकेत वाक्यविन्यास को शामिल करने के लिए Cython की अपेक्षा करनी चाहिए।(वर्तमान में यह वैकल्पिक स्थैतिक टाइप किए गए चर के लिए एक अलग वाक्यविन्यास का उपयोग करता है)

संबंधित मुद्दे