2010-09-08 37 views
5

J'ai rencontré un bug en Python (au moins dans 2.6.1) pour la fonction bytearray.fromhex. C'est ce qui se passe si vous essayez l'exemple de la docstring:Travailler autour d'un bug Python dans différentes versions

>>> 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 car il s'agit d'un hit de performance, et tester la version de Python utilisée est mal.

Alors, y a-t-il une meilleure façon de coder autour de ce genre de problème afin qu'il fonctionne pour toutes les versions, de préférence sans le ralentir pour les Pythons qui travaillent?

Répondre

8

Pour les cas comme celui-ci, il est bon de se rappeler qu'un bloc try est très bon marché si aucune exception n'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)) 

Cela permet de travailler 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 de Python explicitement! Le bug lui-même (et il semble certainement en être un) est toujours présent dans Python 2.6.5, mais je n'ai trouvé aucune mention à bugs.python.org, alors peut-être qu'il a été corrigé par accident dans 2.7! Il ressemble à une fonctionnalité Python 3 portée en arrière qui n'a pas été testée correctement en 2.6.

3

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 ne se produit qu'une seule fois, et pendant votre exécution, la fonction correcte est utilisée sans excès de casting Unicode ou d'exception.