2016-06-16 12 views
3

Was ist der beste Weg, um ein String-Objekt mit einem Byte-Objekt zu vergleichen, das sowohl in Python 2 als auch in Python 3 funktioniert? Angenommen, beide sind utf8. Allgemeiner, wie schreibt man einen Python 2 und Python 3 kompatiblen Vergleich von zwei Objekten, die jeweils ein String, ein Byte oder ein Unicode-Objekt sein können?Zeichenkette mit Bytes vergleichen, die in Python 2 und 3 funktionieren

Das Problem ist, dass "asdf" == b"asdf" in Python 2 und Falsch in Python True 3

Inzwischen kann man nicht blind kodieren oder dekodieren Objekte, da Strings in Python 2 hat beide encode und decode Methoden, aber Strings in Python 3 habe nur Methoden kodieren.

, schließlich isinstance(obj, bytes) gibt Wahr zurück, für jeden Nicht-Unicode-String in Python 2 und gibt True zurück, um nur Objekte in Python-Bytes 3.

+4

Warum man sich in erster Linie zu vergleichen? –

+0

@ IgnacioVazquez-Abrams Es ist nicht relevant für die Frage. Die Situation, in der ich darauf stoße, besteht darin, die Ausgabe einer digitalen Signaturbibliothek mit einem Schlüssel einer Webanfrage zu vergleichen; Einer ist eine Zeichenkette, während der andere eine Zeichenkette ist. Diese Frage war jedoch ein Versuch, die allgemeinere Situation zu erfassen, da ich hierzu kein Material gefunden habe. – Zags

+0

Aber das ist nicht sehr nützlich in einer allgemeinen Situation. Normalerweise würden Sie die Bytes in Text dekodieren, bevor Sie sie vergleichen. –

Antwort

5

In beiden Python 2 und Python 3, irgendetwas, das eine Instanz von bytes ist, hat ein Decodiermethode. So können Sie Folgendes tun:

def compare(a, b, encoding="utf8"): 
    if isinstance(a, bytes): 
     a = a.decode(encoding) 
    if isinstance(b, bytes): 
     b = b.decode(encoding) 
    return a == b 
3

können Sie überprüfen, ob Sie Python verwenden 2 oder 3 und entsprechend handeln:

import sys 

if sys.version_info[0] < 3: 
    text_type = unicode 
else: 
    text_type = str 

if isinstance(obj, text_type): 
    result = obj.encode('utf-8') 
else: 
    result = obj 
Verwandte Themen