Frage

Ich habe über einen Fehler in Python kommen (zumindest in 2.6.1) für die bytearray.fromhex Funktion. Dies ist, was passiert, wenn Sie das Beispiel aus dem docstring versuchen:

>>> bytearray.fromhex('B9 01EF')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: fromhex() argument 1 must be unicode, not str

Dieses Beispiel funktioniert in Python 2.7, und ich mag das Problem den besten Weg, wissen, die Codierung um. Ich will nicht immer in Unicode konvertieren, da es eine Performance-Hit ist, und Tests, die Python-Version verwendet wird, fühlt sich falsch.

So gibt es einen besseren Weg, um Code um diese Art von Problem, so dass es für alle Versionen funktionieren wird, vorzugsweise ohne es nach unten für die Arbeits Pythons verlangsamen?

War es hilfreich?

Lösung

Für Fälle wie diesen ist es gut, sich daran zu erinnern, dass ein try Block sehr billig ist, wenn keine Ausnahme ausgelöst. Also ich würde verwenden:

try:
    x = bytearray.fromhex(some_str)
except TypeError:
    # Work-around for Python 2.6 bug 
    x = bytearray.fromhex(unicode(some_str))

Auf diese Weise kann Python 2.6 Arbeit mit einer kleinen Performance-Einbußen, aber 2.7 sollte überhaupt nicht leiden. Es ist sicherlich besser, Überprüfung Python-Version explizit!

Der Fehler selbst (und es ist sicherlich scheint zu sein) ist noch in Python 2.6.5, aber ich konnte keine Erwähnung davon unter bugs.python.org , vielleicht wurde es durch Zufall in 2.7 behoben haben! Es sieht aus wie eine Back-Port-Python 3-Funktion, die nicht richtig in 2.6 getestet wurde.

Andere Tipps

Sie können auch Ihre eigene Funktion erstellen, die Arbeit zu tun, conditionalized auf, was Sie brauchen:

def my_fromhex(s):
    return bytearray.fromhex(s)

try:
    my_fromhex('hello')
except TypeError:
    def my_fromhex(s):
        return bytearray.fromhex(unicode(s))

und dann Verwendung my_fromhex in Ihrem Code. Auf diese Weise nur die Ausnahme geschieht einmal, und während der Laufzeit, die korrekte Funktion ist ohne überschüssige Unicode Gießen oder Ausnahme Maschinen verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top