यह कोड तब तक सही नहीं है जब तक आप कुछ ऐसा नहीं जानते जो हम नहीं करते:
if isinstance(data, bytes):
data = data.decode()
आप के एन्कोडिंग को नहीं जानते (प्रकट करते हैं) data। आप मान रहे हैं कि यह UTF-8 है , लेकिन यह बहुत अच्छी तरह से गलत हो सकता है। चूंकि आपको एन्कोडिंग का पता नहीं है, इसलिए आपके पास टेक्स्ट नहीं है । आपके पास बाइट्स हैं, जिनका सूरज के नीचे कोई अर्थ हो सकता है।
अच्छी खबर यह है कि बाइट्स के सबसे यादृच्छिक क्रम वैध UTF-8 नहीं हैं, इसलिए जब यह टूट जाता है, तो यह errors='strict'चुपचाप गलत काम करने के बजाय जोर से टूट जाएगा ( डिफ़ॉल्ट है)। इससे भी अच्छी खबर यह है कि उन यादृच्छिक क्रमों में से अधिकांश जो वैध यूटीएफ -8 के होते हैं, वे भी मान्य ASCII हैं, जो ( लगभग ) हर किसी को वैसे भी पार्स करने के लिए सहमत हैं।
बुरी खबर यह है कि इसे ठीक करने का कोई उचित तरीका नहीं है। एन्कोडिंग जानकारी प्रदान करने का एक मानक तरीका है: strइसके बजाय का उपयोग करें bytes। अगर कुछ तृतीय-पक्ष कोड आप एक हाथ bytesया bytearrayवस्तु किसी भी आगे संदर्भ या जानकारी के बिना, केवल सही कार्रवाई विफल है।
अब, आप एन्कोडिंग जानते हैं, तो आप functools.singledispatchयहाँ उपयोग कर सकते हैं :
@functools.singledispatch
def foo(data, other_arguments, ...):
raise TypeError('Unknown type: '+repr(type(data)))
@foo.register(str)
def _(data, other_arguments, ...):
@foo.register(bytes)
@foo.register(bytearray)
def _(data, other_arguments, ...):
data = data.decode('encoding')
return foo(data, other_arguments, ...)
यह तरीकों पर काम नहीं करता है, और dataपहला तर्क होना चाहिए। यदि वे प्रतिबंध आपके लिए काम नहीं करते हैं, तो अन्य उत्तरों में से एक का उपयोग करें।