LINUX.ORG.RU

Работа с байт-строками в Python3

 ,


0

1

Здравствуйте

Перевожу одну библиотеку со второго на третий питон. 2to3 исправила мне принты и другие мелочи

Проблема со строками. Во py2 строки байтовые, чем автор воспользовался по полной: все двоичные данные хранятся и обрабатываются как строки.

Поиском прошелся по строковым литералам, заменил всякие d='\x05' на d=b'\x05'. Но тут объявился новый челлендж: во втором питоне индексация байтстроки возвращает байтстроку, а в третьем питоне она возвращает число.

Размышления насколько то или иное поведение логично оставим на совести Гвидо, но факт в том, что почти вся логика библиотеки стала невалидна.

Примеры фейлов:

data = b'123'

data[0] == b'1' # fail. data[0] == 49
# При этом 🤦
(b'1' in data) == True 

for i in data:
    # В py2 тут будут '1', '2', '3'. В py3 - 49, 50, 51

И если превый пример я с горем пополам победил, заменив везде data[0] на data[0:1]. То что делать с циклом?

Как в цикле получить байтстроки вместо чисел? Желательно не прибегая к декодированию (chr(49).encode(), bytes([49]))

★★★★★
Ответ на: комментарий от Deleted

Перечтал хелп про bytes. Оказывается bytes(iterable_of_ints) не делает encode/decode. Сойдет. Зря писал пост)

makoven ★★★★★
() автор топика
Ответ на: комментарий от MyTrooName

Я плохо соображал пока охреневал от кардинальных перемен пузика. Думал, запущу 2to3 и дело с концом

makoven ★★★★★
() автор топика
Ответ на: комментарий от makoven

Думал, запущу 2to3 и дело с концом

увы :( хотя я 2to3 никогда не делал, слава богам

MyTrooName ★★★★★
()
Ответ на: комментарий от pawnhearts

Это для написание скриптов, которые будут совместимы между 2 и 3 версиями.

kukuruku ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.