2011-06-07 11 views
6

मैं एक फ़ंक्शन बना रहा हूं जो या तो यूनिकोड स्ट्रिंग या बाइट्स (या बाइटियर) ऑब्जेक्ट स्वीकार करेगा। मैं यह सुनिश्चित करना चाहता हूं कि केवल उन प्रकारों को पारित किया जाए। मुझे पता है कि मैं जांच सकता हूं कि isinstance(x, str) कर कुछ स्ट्रिंग है या नहीं, और मुझे पता है कि मैं isinstance(x, bytes) or isinstance(x, bytearray) लिख सकता हूं।बाइट्स और बाइटियर के सुपरक्लास?

उत्तरार्द्ध की जांच करने के लिए एक और संक्षिप्त तरीका है, यानी, क्या कोई कक्षा है जिसमें से bytes और bytearray व्युत्पन्न है?

>>> bytearray.__base__ 
<class 'object'> 
>>> bytes.__base__ 
<class 'object'> 

प्रकार के लिए जांच न करें:

+1

क्यों अन्य प्रकार है कि आपके समारोह की आवश्यकताओं के साथ-साथ समर्थन को स्वीकार नहीं है ? स्पष्ट रूप से किस प्रकार की जांच करें? –

+0

@Jim: ठीक है, मुझे नहीं पता। मैं किसी भी बाइनरी डेटा के लिए एलजेडब्लूडब्ल्यू संपीड़न (एक अभ्यास के रूप में) लागू करने की कोशिश कर रहा हूं। स्वीकार करने के लिए अन्य प्रकार क्या समझेंगे? – Javier

+3

उदाहरण के लिए NumPy arrays। या सी एक्सटेंशन प्रकार आपके पुस्तकालय के उपयोगकर्ता ने खुद को लिखा है। आप सिर्फ यह नहीं जानते कि यह किस प्रकार के लिए उपयोगी हो सकता है। आपको जो मिलता है उसके साथ काम करने का प्रयास करें - यदि आपका प्रकार आवश्यकताओं को पूरा नहीं करता है तो आपका कोड असफल हो जाएगा। –

उत्तर

6

object के अलावा कोई आम आधार वर्ग नहीं है। उपयोगकर्ता को जो भी प्रकार की इच्छा है उसके पैरामीटर पास करने दें। यदि प्रकार में आवश्यक इंटरफ़ेस नहीं है, तो आपका कोड वैसे भी असफल हो जाएगा।

+1

यह [डक टाइपिंग] है (https://en.wikipedia.org/wiki/Duck_typing) सिद्धांत। –

2

आप उपयोग कर सकते हैं:

isinstance(x, (bytes, bytearray)) 

हालांकि, duck typing, उपयोगी हो सकता है तो अन्य प्रकार बाइट या bytearray से पाने नहीं है, लेकिन लागू करने सही तरीके कार्य करने के लिए पारित किया जा सकता है।

+0

आपको अतिरिक्त कोष्ठक की आवश्यकता है: 'isinstance (x, (बाइट्स, bytearray))'। –

+0

आप बिल्कुल सही हैं। – Robin

2

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

आप अजगर 2 का समर्थन करना चाहते हैं, तो आप भी एक विशेष मामले के रूप तार को स्वीकार करने की जरूरत है, के रूप में है कि अजगर 2 के लिए द्विआधारी प्रकार

+0

मुझे लगता है कि वे द्विआधारी डेटा नहीं हैं, लेकिन मैंने सोचा कि यह तारों को स्वीकार करने के लिए समझ में आया क्योंकि कोई पाठ को संपीड़ित करना चाहता है। फ़ंक्शन इस मामले के लिए जांच करता है और स्ट्रिंग को अपने यूटीएफ -8 बाइनरी प्रतिनिधित्व में डीकोड करता है। – Javier

+1

@ जेवियर बडिया: अगर वे पाठ को संपीड़ित करना चाहते हैं तो उन्हें पहले इसे एन्कोड करना चाहिए। यूटीएफ 8 में एन्कोड किए गए चीनी पाठ को संपीड़ित करना उदाहरण के लिए काफी व्यर्थ है, क्योंकि यूटीएफ -16 एक अधिक कुशल एन्कोडिंग होगा। और यूटीएफ -16 एन्कोडिंग में अंग्रेजी पाठ को संपीड़ित करना उतना ही मूर्ख होगा। –

+0

मुझे लगता है कि समझ में आता है। सहायता के लिए धन्यवाद। – Javier

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