2010-09-08 15 views
5

Ho incontrato un bug in Python (almeno in 2.6.1) per la funzione bytearray.fromhex. Questo è quello che succede se si prova l'esempio della docstring:Utilizzo di bug Python in diverse versioni

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

Questo esempio funziona bene in Python 2.7, e voglio conoscere il modo migliore di codificare per aggirare il problema. Non voglio sempre convertirmi in unicode dato che si tratta di un problema di prestazioni e testare quale versione di Python è in uso sembra sbagliata.

Quindi c'è un modo migliore per codificare questo tipo di problema in modo che funzioni per tutte le versioni, preferibilmente senza rallentarlo per i Python funzionanti?

risposta

8

Per casi come questo è bene ricordare che un blocco try è molto economico se non viene lanciata alcuna eccezione. Quindi userei:

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

Ciò consente a Python 2.6 di funzionare con un piccolo risultato di prestazioni, ma 2.7 non dovrebbe risentirne affatto. È certamente preferibile controllare esplicitamente la versione di Python!

Il bug stesso (e di sicuro sembra essere uno solo) è ancora presente in Python 2.6.5, ma non ho trovato alcuna menzione al numero bugs.python.org, quindi forse è stato risolto per errore in 2.7! Sembra una funzionalità Python 3 back-port che non è stata testata correttamente in 2.6.

3

È anche possibile creare la propria funzione per fare il lavoro, conditionalized su quello che vi serve:

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

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

e quindi utilizzare my_fromhex nel codice. In questo modo, l'eccezione si verifica solo una volta e durante il runtime, viene utilizzata la funzione corretta senza eccessiva trasmissione unicode o meccanismo di eccezione.

Problemi correlati