Question

Je suis tombé sur un bug en Python (au moins en 2.6.1) pour la fonction bytearray.fromhex. C'est ce qui se passe si vous essayez l'exemple de la docstring:

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

Cet exemple fonctionne très bien en Python 2.7, et je veux connaître la meilleure façon de coder autour du problème. Je ne veux pas toujours convertir en unicode comme il est un succès de la performance, et les tests de la version Python est utilisé se sent mal.

Ainsi est-il une meilleure façon de coder autour de ce genre de problème pour que cela fonctionne pour toutes les versions, de préférence sans le ralentir pour les Pythons de travail?

Était-ce utile?

La solution

Pour des cas comme cela, il est bon de se rappeler qu'un bloc try est vraiment pas cher si aucune exception est levée. Donc, j'utiliser:

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

Travaillons Python 2.6 avec un petit coup de performance, mais 2,7 ne devrait pas souffrir du tout. Il est certainement préférable de vérifier la version Python explicitement!

Le bug lui-même (et il ne semble certainement être l'un) est toujours présent en Python 2.6.5, mais je ne pouvais pas trouver mention bugs.python.org , alors peut-être qu'il a été fixé par hasard en 2.7! Il ressemble à une fonction Python 3 back-ports qui n'a pas été testé correctement 2.6.

Autres conseils

Vous pouvez également créer votre propre fonction pour faire le travail, conditionalized sur ce que vous avez besoin:

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

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

puis utilisez my_fromhex dans votre code. De cette façon, l'exception se produit qu'une seule fois, et pendant l'exécution, la fonction correcte est utilisée sans coulée en excès unicode ou machines exception.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top