2016-01-17 6 views
12

नया typing मॉड्यूल में "SupportsInt" (-फ्लैट, -बाइट्स इत्यादि) जैसे नामों के साथ कई ऑब्जेक्ट्स हैं। the documentation page for the module पर नाम और विवरण, यह सुझाव देने के लिए पढ़ा जा सकता है कि आप यह जांच सकते हैं कि कोई ऑब्जेक्ट एक प्रकार का है जो "__int__() का समर्थन करता है"। लेकिन अगर आप isinstance() उपयोग करने का प्रयास है, यह एक प्रतिक्रिया यह स्पष्ट है कि है कि कुछ आप करते हैं के लिए होती हैं नहीं है कि बनाता है देता है: दूसरी ओर"प्रोटोकॉल का उपयोग isinstance() के साथ नहीं किया जा सकता है" - क्यों नहीं?

>>> isinstance(5, typing.SupportsInt) 
(Traceback omitted) 
TypeError: Protocols cannot be used with isinstance(). 

, आप issubclass() उपयोग कर सकते हैं:

>>> issubclass((5).__class__, typing.SupportsInt) 
True 
>>> issubclass(type(5), typing.SupportsInt) 
True 

इस संदर्भ में "प्रोटोकॉल" क्या है? इस तरह से isinstance() के उपयोग को अस्वीकार क्यों करता है?

+1

'टाइपिंग' मॉड्यूल का उद्देश्य ** नहीं ** ** उन चेक को करने का तरीका प्रदान करने के लिए है। इसका मतलब उनके एनोटेशन में कार्यों के प्रकार आदि प्रदान करने का एक आम तरीका प्रदान करना है। बतख-टाइपिंग अभी भी वरीयता दी गई है, आप अपने उपयोगकर्ता को यह बताने के लिए उन प्रकारों का उपयोग कर सकते हैं कि फ़ंक्शन का उद्देश्य कैसे कहा जाता है। – Bakuriu

+0

@ बाकुरीयू, लेकिन टाइपिंग मॉड्यूल को स्थिर प्रकार की जांच करने की अनुमति देने के लिए प्रदान किया जाता है, और इसलिए यह मानना ​​उचित है कि यह मशीनरी को पहचानने के लिए प्रदान करेगा (कहें) कि कोई विशेष वस्तु किसी विशेष प्रकार का है या नहीं। अगर मैं टाइपिंग टाइपिंग के रूप में एनोटेटेड पैरामीटर के रूप में 5 को पास करने वाले फ़ंक्शन का आह्वान करता हूं। समर्थन INT, तो एक स्थिर प्रकार परीक्षक कैसे पता चलेगा कि यह मान्य है? – Hammerite

उत्तर

0

प्रलेखन के रूप में कहते हैं: At runtime, isinstance(x, T) will raise TypeError. In general, isinstance() and issubclass() should not be used with types. (https://docs.python.org/3/library/typing.html?highlight=typing#typing.TypeVar)

+0

यह क्या होता है इसका विवरण है। सवाल पूछता है कि यह व्यवहार क्यों है। आपने पूछा गया था कि आपने एक अलग सवाल का जवाब दिया है। – Hammerite

1

यह PEP 484 में दिए गए तर्क के सभी है, typing मॉड्यूल के लिए पीईपी:

क्योंकि typing.Callable एक के रूप में दोहरी ड्यूटी करता है collections.abc. के लिए प्रतिस्थापन। स्थिर, isinstance (x, typing.Callable) 'isinstance (x, collections.abc.Callable) को संदर्भित करके कार्यान्वित किया जाता है। हालांकि, isinstance (एक्स, टाइपिंग। सक्षम [...]) समर्थित नहीं है।

एक प्रोटोकॉल भी एक magic method के रूप में जाना जाता है।

>>> dir(object) 
['__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', 
'__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__le__', 
'__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__sizeof__', '__str__', '__subclasshook__'] 

मैं क्यों typingisinstance का समर्थन नहीं करता के लिए कोई स्पष्ट कारण नहीं मिला है: ये अजगर प्रोटोकॉल के सबसे (पूरी सूची here) कर रहे हैं। issubclass काम करता है कि isinstance__class_ प्रोटोकॉल का उपयोग करता है जिसे typing में अनुमति नहीं है, जबकि issubclass__subclasshook__ प्रोटोकॉल का उपयोग करता है। मेरा मानना ​​है कि कारण यह है कि कार्यक्षमता पहले से ही collections.abc.Callable में कोडित की गई थी और वे इसे typing मॉड्यूल में रिकोड नहीं करना चाहते थे।

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

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