Bilmediğimiz bir şeyi bilmediğiniz sürece bu kod doğru değildir:
if isinstance(data, bytes):
data = data.decode()
Kodlamasını bilmiyorsunuz (görünüyorsunuz) data
. UTF-8 olduğunu varsayıyorsunuz , ancak bu çok yanlış olabilir. Kodlamayı bilmediğiniz için metniniz de yoktur . Güneşin altında herhangi bir anlamı olabilecek baytlarınız var.
İyi haber şu ki, rastgele bayt dizilerinin çoğu geçerli UTF-8 değildir, bu nedenle bu kesildiğinde errors='strict'
, sessizce yanlış bir şey yapmak yerine yüksek sesle kırılacaktır ( varsayılandır). Daha da iyi haber şu ki, geçerli UTF-8 olan bu rastgele dizilerin çoğunun aynı zamanda geçerli ASCII olması ( neredeyse ) herkesin nasıl ayrıştırılacağını kabul .
Kötü haber şu ki, bunu düzeltmenin makul bir yolu yok. Kodlama bilgisi sağlamanın standart bir yolu vardır: str
yerine kullanın bytes
. Bazı üçüncü taraf kodu size daha fazla bağlam veya bilgi olmadan bir nesne bytes
veya bytearray
nesne verdiyse, tek doğru eylem başarısız olmaktır.
Şimdi, kodlamayı bildiğinizi varsayarsak, functools.singledispatch
burada kullanabilirsiniz :
@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, ...)
Bu yöntemler üzerinde çalışmaz data
ve ilk argüman olmalıdır. Bu kısıtlamalar sizin için işe yaramazsa, bunun yerine diğer yanıtlardan birini kullanın.