Domanda

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:

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

In questo esempio funziona bene in Python 2.7, e voglio conoscere il modo migliore di codificare per aggirare il problema. Non voglio convertire sempre in Unicode come si tratta di un calo di prestazioni, e di test che la versione di Python è in uso si sente male.

Così, c'è un modo migliore di codificare intorno a questo tipo di problema in modo che funziona per tutte le versioni, preferibilmente senza rallentarla per i Pythons di lavoro?

È stato utile?

Soluzione

Per casi come questo è bene ricordare che un blocco try è molto a buon mercato se viene lanciata non fa eccezione. Così userei:

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

In questo modo, Python 2.6 lavoro con un piccolo calo di prestazioni, ma 2.7 non dovrebbe soffrire affatto. E 'certamente preferibile controllare la versione di Python in modo esplicito!

Il bug in sé (e lo fa certamente sembra essere uno) è ancora presente in Python 2.6.5, ma non ho potuto trovare alcuna menzione di esso a bugs.python.org , quindi forse è stato fissato per caso in 2.7! Sembra un Python 3 funzione di back-porting che non è stato testato in modo corretto 2.6.

Altri suggerimenti

È anche possibile creare la propria funzione per fare il lavoro, conditionalized su ciò che è necessario:

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 tempo di esecuzione, la funzione corretta viene utilizzato senza macchinari unicode fusione o eccezione in eccesso.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top