Kode ini tidak benar kecuali Anda mengetahui sesuatu yang tidak kami ketahui:
if isinstance(data, bytes):
data = data.decode()
Anda tidak (tampaknya) mengetahui pengkodean data. Anda berasumsi bahwa itu UTF-8 , tetapi itu bisa jadi salah. Karena Anda tidak tahu pengkodeannya, Anda tidak memiliki teks . Anda memiliki byte, yang bisa memiliki arti apa pun di bawah matahari.
Kabar baiknya adalah bahwa sebagian besar urutan byte yang acak bukanlah UTF-8 yang valid, jadi ketika ini rusak, itu akan rusak dengan keras ( errors='strict'adalah default) daripada diam-diam melakukan hal yang salah. Berita yang lebih baik lagi adalah bahwa sebagian besar urutan acak yang kebetulan merupakan UTF-8 yang valid juga merupakan ASCII yang valid, yang ( hampir ) semua orang setuju tentang cara mengurai.
Kabar buruknya adalah tidak ada cara yang masuk akal untuk memperbaikinya. Ada cara standar untuk memberikan informasi pengkodean: gunakan strsebagai ganti bytes. Jika beberapa kode pihak ketiga memberi Anda objek bytesatau bytearraytanpa konteks atau informasi lebih lanjut, satu-satunya tindakan yang benar adalah gagal.
Sekarang, dengan asumsi Anda mengetahui pengkodeannya, Anda dapat menggunakan di functools.singledispatchsini:
@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, ...)
Ini tidak berfungsi pada metode, dan dataharus menjadi argumen pertama. Jika batasan tersebut tidak berhasil untuk Anda, gunakan salah satu jawaban lainnya.