Как напечатать объект контейнера с Unicode-содержащими значениями? - PullRequest
4 голосов
/ 18 января 2012

следующий код

# -*- coding: utf-8 -*-
x = (u'abc/αβγ',)
print x
print x[0]
print unicode(x).encode('utf-8')
print x[0].encode('utf-8')

... производит:

(u'abc/\u03b1\u03b2\u03b3',)
abc/αβγ
(u'abc/\u03b1\u03b2\u03b3',)
abc/αβγ

Есть ли способ заставить Python напечатать

('abc/αβγ',)

что не требует от меня построения строкового представления кортежа самостоятельно? (Под этим я подразумеваю объединение "(", "'", закодированного значения, "'", "," и ")"?

Кстати, я использую Python 2.7.1.

Спасибо!

Ответы [ 3 ]

3 голосов
/ 18 января 2012

Вы можете декодировать str представление вашего кортежа с помощью 'raw_unicode_escape'.

In [25]: print str(x).decode('raw_unicode_escape')
(u'abc/αβγ',)
1 голос
/ 18 января 2012

Следующее должно быть хорошим началом:

>>> x = (u'abc/αβγ',)
>>> S = type('S', (unicode,), {'__repr__': lambda s: s.encode('utf-8')})
>>> tuple(map(S, x))
(abc/αβγ,)

Идея состоит в том, чтобы создать подкласс юникода, который будет иметь __repr__() больше по вашему вкусу.Как лучше всего заключить результат в кавычки, это работает для вашего примера:

>>> S = type('S', (unicode,), {'__repr__': lambda s: "'%s'" % s.encode('utf-8')})
>>> tuple(map(S, x))
('abc/αβγ',)

... но будет выглядеть странно, если в строке будет одна кавычка:

>>> S("test'data")
'test'data'
1 голос
/ 18 января 2012

Я так не думаю - __repr__() кортежа встроен, и AFAIK просто вызовет __repr__ для каждого элемента кортежа.В случае символов Unicode вы получите escape-последовательности.

(Если только решение Gandaro не работает для вас - я не могу заставить его работать в простой оболочке Python, но это может быть либо моя локальили что-то особенное в ipython.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...