В Python2 __repr__
(и __str__
) должны возвращать строковый объект, а не
Unicode объект. В Python3 ситуация обратная: __repr__
и __str__
должен возвращать объекты в кодировке Unicode, а не объекты в байтах (строки):
class Foo(object):
def __repr__(self):
return u'\N{WHITE SMILING FACE}'
class Bar(object):
def __repr__(self):
return u'\N{WHITE SMILING FACE}'.encode('utf8')
repr(Bar())
# ☺
repr(Foo())
# UnicodeEncodeError: 'ascii' codec can't encode character u'\u263a' in position 0: ordinal not in range(128)
В Python2 у вас нет выбора. Вы должны выбрать кодировку для
возвращаемое значение __repr__
.
Кстати, вы читали PrintFails wiki ? Это может не отвечать напрямую
ваши другие вопросы, но я нашел, что это полезно для освещения, почему некоторые
происходят ошибки.
При использовании from __future__ import unicode_literals
,
'<{}>'.format(repr(x).decode('utf-8'))).encode('utf-8')
проще записать как
str('<{}>').format(repr(x))
при условии, что str
кодируется в utf-8
в вашей системе.
Без from __future__ import unicode_literals
выражение можно записать в виде:
'<{}>'.format(repr(x))