2016-04-12 4 views

Antwort

6

Python 2 berücksichtigt Bytestrings und Unicode gleich. Das hat übrigens nichts mit dem enthaltenden Tupel zu tun. Stattdessen geht es um eine implizite Typumwandlung, die ich im Folgenden erläutern werde.

Es ist schwierig, es zu zeigen, mit ‚einfach‘ ascii Codepoints, so zu sehen, was wirklich unter der Haube geht weiter, wir einen Ausfall durch höhere Codepoints provozieren können:

>>> bites = u'Ç'.encode('utf-8') 
>>> unikode = u'Ç' 
>>> print bites 
Ç 
>>> print unikode 
Ç 
>>> bites == unikode 
/Users/wim/Library/Python/2.7/bin/ipython:1: UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal 
    #!/usr/bin/python 
False 

eine Unicode zu sehen und Bytes Im obigen Vergleich hat Python implizit versucht, die Bytezeichenfolge zu einem Unicode-Objekt zu dekodieren, indem eine Annahme gemacht wurde, dass die Bytes mit sys.getdefaultencoding() (was auf meiner Plattform 'ASCII' ist) codiert wurden.

In dem Fall, den ich gerade oben gezeigt habe, ist dies fehlgeschlagen, weil die Bytes in 'utf-8' codiert wurden. Jetzt wollen wir es „Arbeit“ machen:

>>> bites = u'Ç'.encode('ISO8859-1') 
>>> unikode = u'Ç' 
>>> import sys 
>>> reload(sys) # please don't ever actually use this hack, guys 
<module 'sys' (built-in)> 
>>> sys.setdefaultencoding('ISO8859-1') 
>>> bites == unikode 
True 

Ihre Upconversion „Werke“ in so ziemlich die gleiche Weise, aber unter Verwendung eines ‚ascii‘ Codec. Diese Art von impliziten Konvertierungen zwischen Bytes und Unicode sind eigentlich ziemlich böse und können eine Menge von pain verursachen, also wurde beschlossen, die in Python 3 zu beenden, weil "explizit ist besser als implizit".

Als eine kleine Exkurs, auf Python 3+ ist Ihr Code eigentlich beide Unicode String Literale, so dass sie sowieso gleich sind. Das Präfix u wird stillschweigend ignoriert. Wenn Sie ein Bytezeichenfolge-Literal in python3 möchten, müssen Sie es wie b'this' angeben. Dann möchten Sie entweder 1) die Bytes explizit dekodieren oder 2) das Unicode-Objekt explizit codieren, bevor Sie einen Vergleich durchführen.

+2

Vielen Dank für die ausführliche Erklärung. – smwikipedia