Я работаю над преобразованием большого проекта из python2
в python3
(не требуется python2
обратная совместимость).
При тестировании преобразования я обнаружил, что у меня возникла проблема, когда определенные строки преобразовывались в bytes
объекты, что вызывало проблемы. Я проследил его до следующего метода, который вызывается в нескольких местах:
def custom_format(val):
return val.encode('utf8').strip().upper()
In python2
:
custom_format(u'\xa0')
# '\xc2\xa0'
custom_format('bar')
# `BAR`
В python3
:
custom_format('\xa0')
# b'\xc2\xa0'
custom_format('bar')
# b`BAR`
Причина, по которой это проблема, заключается в том, что в некоторых точках вывод custom_format
предназначен для вставки в строку шаблона SQL
с использованием format()
, но 'foo = {}'.format(b'bar') == "foo = b'BAR'"
, что может испортить потенциал SQL
синтаксис.
Простое удаление части encode('utf8')
гарантирует, что custom_format('bar')
правильно вернет 'BAR'
, но теперь custom_format('\xa0')
возвращает '\xa0'
, а не '\xc2\xa0'
версии python2
. (хотя я не знаю достаточно о юникоде, чтобы знать, плохо это или нет)
Не связываясь с частями кода SQL
или format()
, как я могу убедиться, что ожидаемое поведение от версии python2
продемонстрировано в версии python3
? Это так же просто, как сбросить encode('utf8')
или это вызовет непреднамеренные конфликты?