Обработка encode () при конвертации из python2 в python3 - PullRequest
0 голосов
/ 12 января 2019

Я работаю над преобразованием большого проекта из 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') или это вызовет непреднамеренные конфликты?

1 Ответ

0 голосов
/ 12 января 2019

Если вы хотите, чтобы все входящие строки, будь то str s или bytes, были преобразованы в bytes, тогда вам нужно сохранить encode, поскольку Python3 использует str вместо bytes (что имеет место для Python2) как собственный тип строки. encode преобразует str в bytes.

Если вы хотите убедиться, что запросы выглядят правильно. Тогда вы можете просто удалить encode и позволить Python3 обрабатывать все за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...