Ich möchte, dass meine Funktion ein Argument verwendet, das ein Unicode-Objekt oder eine utf-8-codierte Zeichenfolge sein könnte. Innerhalb meiner Funktion möchte ich das Argument in Unicode konvertieren. Ich habe so etwas:
%Vor%Ist es möglich, die Verwendung von isinstance zu vermeiden? Ich war auf der Suche nach etwas mehr Ente tippen freundlich.
Während meiner Experimente mit der Decodierung bin ich auf einige seltsame Verhaltensweisen von Python gestoßen. Zum Beispiel:
%Vor%Oder
%Vor%Übrigens. Ich benutze Python 2.6
Sie könnten einfach versuchen, es mit dem 'utf-8' Codec zu dekodieren, und wenn das nicht funktioniert, dann geben Sie das Objekt zurück.
%Vor% Wenn Sie ein Unicode-Objekt nehmen und seine decode
-Methode mit dem 'utf-8'
-Codec aufrufen, versucht Python zuerst, das Unicode-Objekt in ein String-Objekt zu konvertieren, und dann ruft es die Decodierung des String-Objekts auf ('utf-8'). ) Methode.
Manchmal schlägt die Konvertierung von einem Unicode-Objekt in ein String-Objekt fehl, weil Python2 standardmäßig den ASCII-Codec verwendet.
Versuchen Sie also im Allgemeinen niemals, Unicode-Objekte zu dekodieren. Oder, wenn Sie es versuchen müssen, fangen Sie es in einem try..except Block ab. Es kann ein paar Codecs geben, für die die Dekodierung von Unicode-Objekten in Python2 funktioniert (siehe unten), aber sie wurden in Python3 entfernt.
Sehen Sie sich dieses Python-Fehlerticket für eine interessante Diskussion des Problems an. und auch Guido van Rossums Blog :
"Wir übernehmen ein etwas anderes Ansatz zu Codecs: während in Python 2, Codecs können entweder Unicode oder 8-Bit als Eingabe und erzeugen entweder als Ausgabe, in Py3k, Codierung ist immer a Übersetzung aus einem Unicode (Text) String zu einem Array von Bytes und Decodierung geht immer das Gegenteil Richtung. Das bedeutet, dass wir mussten Drop ein paar Codecs, die nicht hineinpassen Dieses Modell, zum Beispiel rot13, base64 und bz2 (diese Conversions sind immer noch unterstützt, nur nicht durch die API kodieren / decodieren. "
Ich bin mir nicht bewusst, dass es eine gute Möglichkeit gibt, die isinstance
-Kontrolle in Ihrer Funktion zu vermeiden, aber vielleicht ist es jemand anderes. Ich kann darauf hinweisen, dass die beiden Seltsamkeiten, die Sie anführen, darin bestehen, dass Sie etwas tun, was keinen Sinn ergibt: Sie versuchen, Unicode zu dekodieren, das bereits in Unicode dekodiert wurde.
Der erste sollte stattdessen so aussehen, der die UTF-8-Codierung dieser Zeichenfolge in die Unicode-Version decodiert:
%Vor% Und Ihre Sekunde sollte so aussehen (nicht mit u''
Unicode String-Literal):