2010-09-08 9 views
5

Ich bin auf einen Fehler in Python (mindestens in 2.6.1) für die bytearray.fromhex-Funktion gestoßen. Dies ist, was passiert, wenn Sie das Beispiel aus dem docstring versuchen:Python-Fehler in verschiedenen Versionen umgehen

>>> 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 die Codierung, um das Problem den besten Weg, wissen. Ich möchte nicht immer in Unicode konvertieren, da es ein Performance-Hit ist, und zu testen, welche Python-Version verwendet wird, fühlt sich falsch an.

Gibt es also eine bessere Möglichkeit, um diese Art von Problem zu programmieren, so dass es für alle Versionen funktioniert, vorzugsweise ohne es für die arbeitenden Pythons zu verlangsamen?

Antwort

8

Für Fälle wie diese ist es gut zu erinnern, dass ein try Block sehr billig ist, wenn keine Ausnahme geworfen wird. Also würde ich verwenden:

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

Dieser Python läßt 2.6 Arbeit mit einer kleinen Performance-Einbußen, aber 2.7 sollte überhaupt nicht leiden. Es ist sicherlich besser, die Python-Version explizit zu überprüfen!

Der Bug selbst (und es scheint sicherlich einer zu sein) ist immer noch in Python 2.6.5 vorhanden, aber ich konnte keine Erwähnung davon finden Sie unter bugs.python.org, also vielleicht wurde es versehentlich in 2.7 behoben! Es sieht aus wie ein Python 3-Feature mit Back-Portierung, das in 2.6 nicht richtig getestet wurde.

3

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 my_fromhex in Ihrem Code verwenden. Auf diese Weise tritt die Ausnahme nur einmal auf, und während der Laufzeit wird die korrekte Funktion ohne übermäßige Unicode-Casting- oder Exception-Maschinerie verwendet.

Verwandte Themen