Dieser Code ist nicht korrekt, es sei denn, Sie wissen etwas, was wir nicht wissen:
if isinstance(data, bytes):
data = data.decode()
Sie kennen (anscheinend) die Kodierung von nicht data. Sie nehmen an, dass es UTF-8 ist , aber das könnte sehr gut falsch sein. Da Sie die Codierung nicht kennen, haben Sie keinen Text . Sie haben Bytes, die unter der Sonne jede Bedeutung haben könnten.
Die gute Nachricht ist, dass die meisten zufälligen Folgen von Bytes nicht für UTF-8 gültig sind. Wenn dies unterbrochen wird, wird es laut unterbrochen ( errors='strict'ist die Standardeinstellung), anstatt stillschweigend das Falsche zu tun. Die noch bessere Nachricht ist, dass die meisten dieser zufälligen Sequenzen, die zufällig UTF-8 sind, auch gültige ASCII-Sequenzen sind, denen ( fast ) alle zustimmen, wie sie sowieso analysiert werden sollen.
Die schlechte Nachricht ist, dass es keinen vernünftigen Weg gibt, dies zu beheben. Es gibt eine Standardmethode zum Bereitstellen von Codierungsinformationen: Verwenden Sie stranstelle von bytes. Wenn Ihnen ein Code eines Drittanbieters ein bytesoder ein bytearrayObjekt ohne weiteren Kontext oder Informationen übergeben hat, besteht die einzig richtige Aktion darin, fehlzuschlagen.
Angenommen, Sie kennen die Codierung, können Sie sie functools.singledispatchhier verwenden:
@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, ...)
Dies funktioniert bei Methoden nicht und datamuss das erste Argument sein. Wenn diese Einschränkungen bei Ihnen nicht funktionieren, verwenden Sie stattdessen eine der anderen Antworten.