Невозможно кодировать/декодировать вывод 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.