Мне нужно перенести некоторый код из Python2 в Python3, а основная проблема, похоже, в байтах, потому что str (bytes) дает мне b'%s'
результат, но '%s'
необходим, поэтому я решил override __str__()
метод класса байтов для печати именно того, что я хочу.Переопределить встроенный метод __str__ в python
Я попытался исправить builtins.bytes
с классом, унаследованным от байтов, но, похоже, работает только для одного файла, а не для всего проекта, а также не влияет на литералы байтов (b''
).
Если есть какие-либо другие способы (менее болезненные) для порта от py2 до py3, было бы неплохо их увидеть.
Использование .decode('UTF-8')
неприемлемо, так как проект более 4k строк и добавление метода декодирования ко всем необходимым местам приведет к подсчету прогрессивных ошибок, а также некоторые из этих .decode
мест находятся в 3-х партийных библиотеках.
Я пытался сделать что-то вроде этого:
import builtins
class StrBytes(builtins.bytes):
def __str__(self):
return self.decode('UTF-8')
builtins.bytes = StrBytes
Тогда, если я использую bytes()
он создает StrBytes
объект и str(bytes())
именно то, что я хочу. Таким образом, это плохо, потому что она не распространяется на построение байтов объекта из байтов литералов:
>>> type(bytes())
<class 'StrBytes'>
>>> type(b'')
<class 'bytes'>
И я не уверен, если это работает для всего проекта, а не только один файл.
Во многих различных местах моего кода, у меня есть что-то вроде этого:
return b''.join(some_extra_values)
keys = [b'1', b'2', b'3'] # actually keys are given from another part of code
for key in keys:
some_dict[key] = some_value
some_dict['1'] # works in py2, not in py3, KeyError
Не могли бы вы опубликовать исполняемый, самодостаточный пример? – dm03514
Не могли бы вы [изменить свой вопрос] (https://stackoverflow.com/posts/39574286/edit) включить пример строки кода, которую нужно преобразовать, и того, что вы пробовали, кроме 'decode() '? – cxw