2016-07-17 4 views
8

List है Sequence का एक उपवर्ग:क्यों है की सूची [str] नहीं अनुक्रम का एक उपवर्ग [str]

>>> issubclass(List[str], Sequence[str]) 
False 

क्यों:

>>> from typing import List, Sequence 
>>> issubclass(List, Sequence) 
True 

लेकिन List[str]Sequence[str] का एक उपवर्ग नहीं है?

+1

यह क्यों होना चाहिए? 'सूची [str] 'और' अनुक्रम [str] 'उदाहरणों की तरह हैं; जेनेरिक प्रकार के विशिष्ट रूप। 'सूची()' 'abc.equequence()' के उप-वर्ग नहीं है। –

+0

या इसे अलग-अलग रखें: * एनोट-ए के संबंध में 'सूची [str] 'और' अनुक्रम [str] 'के बीच एक आईएस-ए संबंध क्या होगा? –

उत्तर

1

List[str] और Sequence[str] के बीच एक आईएस-ए संबंध क्या होगा जब एनोटेटिंग हो?

यह दूर करने का प्रमुख बिंदु है। यह जांचना कि कोई प्रकार किसी अन्य प्रकार का उप प्रकार है, आमतौर पर ऐसा कुछ नहीं होता है जब आप अपना कोड एनोटेट करते समय कर रहे हों। यह आम तौर पर कुछ ऐसा होता है जिसे देखा गया है और यही वजह है कि the nuking of __subclasscheck__ पर बहस है।

के रूप में मार्क शैनन states in a comment:

यह है कि क्या एक प्रकार का एक प्रकार का एक उप-प्रकार है की जाँच करने के लिए सार्थक है, लेकिन यह एक स्थिर चेकर का काम है और टाइपिंग मॉड्यूल में संबंधित नहीं है।

किसी भी तरह से, चेक all made in GenericMetas __subclasscheck__ कर रहे हैं, सामान्य प्रकार

के रूप में है के लिए metaclass, वर्तमान कार्यान्वयन मामलों पर अधिक ध्यान केंद्रित है, जहां कंटेनर प्रकार समान है, लेकिन अपने उप-पटकथा प्रकार इस में, अलग-अलग मामला, उप-स्क्रिप्टेड प्रकार covariant or contravariant हैं, इस पर निर्भर करता है। उदाहरण के लिए, List प्रकार न तो, जैसे, कर रहे हैं के साथ एक subtype संबंध के लिए जाँच: झूठी

issubclass(List[bool], List[int]) # checks if bool == int 

रिटर्न। (अपने पहले मामले में के रूप में)

issubclass(Sequence[bool], Sequence[int]) # checks if bool is a subclass of int 

दूसरी ओर, प्रकार के लिए एक निर्दिष्ट प्रकार के बिना: दृश्यों के लिए, प्रकार covariant, जैसे, निम्नलिखित पैदावार True रूप

issubclass(List, Sequence) 

__subclasscheck__GenericMeta में delegate से __subclasscheck__ in ABCMeta होगा जहां यह True का मूल्यांकन करेगा।

अंत में, यदि दो प्रकार के अलग हैं के रूप में:

issubclass(List[str], Sequence[str]) 

और issubclass call is an instance of GenericMeta में आधार वर्ग, False दिया जाता है; यह स्थिति typing में अधिकांश प्रकारों से संतुष्ट है।

जो भी मामला यह उल्लेखनीय है कि भविष्य में रिलीज में यह अस्तित्व में नहीं है, या इसका व्यवहार पूरी तरह से अलग हो सकता है; मॉड्यूल अभी भी अस्थायी है।

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