Mã này không đúng trừ khi bạn biết điều gì đó mà chúng tôi không:
if isinstance(data, bytes):
data = data.decode()
Bạn không (dường như) biết mã hóa của data. Bạn đang giả định đó là UTF-8 , nhưng điều đó rất có thể sai. Vì bạn không biết mã hóa, bạn không có văn bản . Bạn có các byte, có thể có bất kỳ ý nghĩa nào dưới ánh mặt trời.
Tin tốt là hầu hết các chuỗi byte ngẫu nhiên không phải là UTF-8 hợp lệ, vì vậy khi điều này bị phá vỡ, nó sẽ phá vỡ lớn ( errors='strict'là mặc định) thay vì âm thầm làm điều sai trái. Tin tốt hơn nữa là hầu hết các chuỗi ngẫu nhiên đó là UTF-8 hợp lệ cũng là ASCII hợp lệ, mà ( gần như ) mọi người đều đồng ý về cách phân tích cú pháp.
Tin xấu là không có cách nào hợp lý để sửa lỗi này. Có một cách tiêu chuẩn để cung cấp thông tin mã hóa: sử dụng strthay vì bytes. Nếu một số mã của bên thứ ba chuyển cho bạn một byteshoặc bytearrayđối tượng mà không có bất kỳ ngữ cảnh hoặc thông tin nào khác, thì hành động đúng duy nhất là không thành công.
Bây giờ, giả sử bạn biết mã hóa, bạn có thể sử dụng functools.singledispatchở đây:
@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, ...)
Điều này không hoạt động trên các phương thức và dataphải là đối số đầu tiên. Nếu những hạn chế đó không phù hợp với bạn, hãy sử dụng một trong các câu trả lời khác để thay thế.