2010-09-08 19 views
5

He encontrado un error en Python (al menos en 2.6.1) para la función bytearray.fromhex. Esto es lo que ocurre si se intenta el ejemplo de la cadena de documentación:Error al trabajar con Python en diferentes versiones

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

Este ejemplo funciona bien en Python 2.7, y quiero saber la mejor forma de codificar el problema. No quiero convertir siempre a Unicode, ya que es un golpe de rendimiento, y probar qué versión de Python se está utilizando se siente mal.

¿Existe una forma mejor de codificar este tipo de problema para que funcione en todas las versiones, preferiblemente sin disminuir la velocidad de funcionamiento de las pitones?

Respuesta

8

Para casos como este, es bueno recordar que un bloque try es muy económico si no se produce ninguna excepción. Así que me gustaría usar:

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

De este modo, Python 2.6 trabajo con un pequeño impacto en el rendimiento, pero 2.7 no debería sufrir en absoluto. ¡Es ciertamente preferible verificar la versión de Python explícitamente!

El error en sí mismo (y ciertamente parece ser uno) todavía está presente en Python 2.6.5, pero no pude encontrar ninguna mención de él en bugs.python.org, por lo que tal vez fue resuelto por accidente en 2.7! Parece una característica de Python 3 retroiluminada que no se probó correctamente en 2.6.

3

También puede crear su propia función para hacer el trabajo, conditionalized de lo que necesita:

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

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

y luego usar my_fromhex en el código. De esta forma, la excepción solo ocurre una vez, y durante su tiempo de ejecución, la función correcta se utiliza sin exceso de conversión unicode o maquinaria de excepción.

Cuestiones relacionadas