Вопрос

Я наткнулся на ошибку в Python (хотя бы в 2.6.1) для bytearray.fromhex функция. Это то, что происходит, если вы попробуете пример из 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

Этот пример работает нормально в Python 2.7, и я хочу знать лучший способ кодирования по поводу проблемы. Я не хочу всегда преобразовывать в Unicode, так как он является ошибочным ударом, а тестирование, на которой используется версия Python, чувствует себя неправильно.

Так есть ли лучший способ кода подобной проблеме, чтобы она будет работать для всех версий, предпочтительно, не замедление его для рабочих питонов?

Это было полезно?

Решение

Для таких случаев, хорошо помнить, что try Блок очень дешевый, если исключение не бросится. Так что я бы использовал:

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

Это позволяет Python 2.6 работать с небольшим ударом производительности, но 2.7 не следует страдать вообще. Обязательно предпочтительно проверять версию Python версию!

Сама ошибка (и она, безусловно, кажется, кажется, одна) все еще присутствует в Python 2.6.5, но я не мог найти ни одно упоминание в Bugs.Python.org., Так, может быть, это было исправлено случайно в 2.7! Он выглядит как функция Back-Ported Python 3, которая не была правильно проверена в 2.6.

Другие советы

Вы также можете создать свою собственную функцию, чтобы выполнить работу, основанную на то, что вам нужно:

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

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

а затем использовать my_fromhex в вашем коде. Таким образом, исключение только один раз происходит, и во время вашего времени выполнения правильная функция используется без избыточного литья Unicode или оборудования исключения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top