Travailler autour de bug Python dans les versions différentes
-
01-10-2019 - |
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?
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.