Работа вокруг ошибки Python в разных версиях - PullRequest
5 голосов
/ 08 сентября 2010

Я столкнулся с ошибкой в ​​Python (по крайней мере в 2.6.1) для функции bytearray.fromhex. Вот что произойдет, если вы попробуете пример из строки документации:

>>> 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, и я хочу знать, как лучше всего решить проблему. Я не хочу всегда конвертировать в юникод, так как это снижает производительность, и тестирование используемой версии Python кажется неправильным.

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

Ответы [ 2 ]

8 голосов
/ 08 сентября 2010

В таких случаях хорошо помнить, что блок 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!Это похоже на функцию Python 3 с обратным портированием, которая не была должным образом протестирована в 2.6.

3 голосов
/ 08 сентября 2010

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

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 или механизма исключения.

...