Невозможно кодировать/декодировать вывод pprint
Этот вопрос основан на побочном эффекте того.
В моих файлах .py
есть указатель кодировки # -*- coding: utf-8 -*-
в первой строке, например my api.py
Как я упоминал по связанному вопросу, я использую HttpResponse
для возврата документации api. Поскольку я определил кодировку:
HttpResponse(cy_content, content_type='text/plain; charset=utf-8')
Все в порядке, и когда я вызываю свою службу API, нет проблем с кодированием, кроме строки, образованной из словаря по параметру pprint
Так как я использую турецкие символы в некоторых значениях в моем dict, pprint преобразует их в эквиваленты unichr
, например:
API_STATUS = {
1: 'müşteri',
2: 'some other status message'
}
my_str = 'Here is the documentation part that contains Turkish chars like işüğçö'
my_str += pprint.pformat(API_STATUS, indent=4, width=1)
return HttpRespopnse(my_str, content_type='text/plain; charset=utf-8')
И мой простой текстовый вывод выглядит так:
Here is the documentation part that contains Turkish chars like işüğçö
{
1: 'm\xc3\xbc\xc5\x9fteri',
2: 'some other status message'
}
Я пытаюсь декодировать или кодировать вывод pprint для разных кодировок, без каких-либо успехов... Какова наилучшая практика для преодоления этой проблемы.
Ответы
Ответ 1
pprint
по умолчанию используется repr
, вы можете обойти это, переопределив PrettyPrinter.format
:
# coding=utf8
import pprint
class MyPrettyPrinter(pprint.PrettyPrinter):
def format(self, object, context, maxlevels, level):
if isinstance(object, unicode):
return (object.encode('utf8'), True, False)
return pprint.PrettyPrinter.format(self, object, context, maxlevels, level)
d = {'foo': u'işüğçö'}
pprint.pprint(d) # {'foo': u'i\u015f\xfc\u011f\xe7\xf6'}
MyPrettyPrinter().pprint(d) # {'foo': işüğçö}
Ответ 2
Вы должны использовать строки unicode вместо 8-битных:
API_STATUS = {
1: u'müşteri',
2: u'some other status message'
}
my_str = u'Here is the documentation part that contains Turkish chars like işüğçö'
my_str += pprint.pformat(API_STATUS, indent=4, width=1)
Модуль pprint
предназначен для распечатки всех возможных типов вложенной структуры читаемым способом. Для этого он будет печатать представление объектов, а затем преобразовывать его в строку, поэтому вы получите синтаксис escape, потому что вы используете строки Unicode или нет. Но если вы используете unicode в своем документе, вам действительно нужно использовать литералы в формате unicode!
В любом случае thg435 предоставил вам решение, как изменить это поведение pformat.