Pregunta

Me 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:

>>> 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 a Unicode siempre y cuando sea un impacto en el rendimiento, y las pruebas de la versión de Python se utiliza siente mal.

Entonces, ¿hay una mejor forma de código en torno a este tipo de problema por lo que funcionará para todas las versiones, preferiblemente sin frenarla para los pitones de trabajo?

¿Fue útil?

Solución

En casos como este, es bueno recordar que un bloque try es muy barato si se lanza una 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 comprobar la versión de Python explícitamente!

El fallo en si mismo (y ciertamente parece ser uno) todavía está presente en Python 2.6.5, pero no pude encontrar ninguna mención de ella en bugs.python.org , así que tal vez se fijó en 2,7 por accidente! Se parece a una función de Python 3 de vuelta con puertos que no se ha probado adecuadamente en 2.6.

Otros consejos

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 el uso my_fromhex en el código. De esta manera, la excepción sólo ocurre una vez, y durante su tiempo de ejecución, la función correcta se utiliza sin exceso de maquinaria para fundición de Unicode o una excepción.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top