То, как распечатать кортежи unicode, представляет в виде строки на языке оригинала (не u'foo' форма)

Это было самое простое: у Heroku не было $FLASK_APP в переменных промежуточной среды. Добавление позволило запустить инструмент командной строки.

enter image description here

12
задан Daniel H 7 March 2009 в 04:44
поделиться

5 ответов

но то, что я хочу видеть распечатанный, удивление:

[(' 亀 '), (' 犬 ')]

Что Вы хотите видеть, что это распечатало на? Поскольку, если это - консоль, это нисколько не гарантировало, что Ваша консоль может отобразить те символы. Поэтому Python ‘repr ()’ представление объектов идет для безопасной опции \-Escape, которые Вы будете всегда мочь видеть на экране и ввести легко.

Как предпосылка необходимо использовать строки Unicode (u''). И, как упомянуто Matthew, если Вы хотите смочь записать u' 亀' непосредственно в источнике, необходимо удостовериться, что Python может считать кодирование файла. Поскольку случайное использование символов неASCII лучше придерживаться завершенной версии u '\u4e80', но когда у Вас есть много восточноазиатского текста, Вы хотите смочь читать, “# coding=utf-8” является определенно способом пойти.

распечатайте' [%s]' %', '.join ([', '.join (' (%s)', %', '.join (ti) для ti в t)])

Это распечатало бы символы, развернутые кавычками. Действительно Вы хотели бы:

def reprunicode(u):
    return repr(u).decode('raw_unicode_escape')

print u'[%s]' % u', '.join([u'(%s,)' % reprunicode(ti[0]) for ti in t])

Это работало бы, но если консоль не поддерживала Unicode (и это особенно неприятно в Windows), Вы получите крупный старый UnicodeError.

В любом случае это редко имеет значение, потому что repr () объекта, который является тем, что Вы видите здесь, обычно не добирается до общедоступного пользовательского интерфейса приложения; это действительно для кодера только.

Однако Вы будете рады знать, что Python 3.0 ведет себя точно, как Вы хотите:

  • простые '' строки без ‘u’ префикса являются теперь строками Unicode
  • repr () показывает большинство символов Unicode дословно
  • Unicode в консоли Windows лучше поддерживается (можно все еще получить UnicodeError на Unix, если среда не является UTF-8),

Python 3.0 является немного новым и не так хорошо поддерживаемый библиотеками, но он мог бы хорошо удовлетворить Вашим потребностям лучше.

7
ответ дан 2 December 2019 в 21:24
поделиться

Во-первых, в Вашем сообщении существует небольшое недоразумение. Если Вы определяете список как это:

>>> t = [('亀',), ('犬',)]

... это не unicodes Вы определяют, но strs. Если Вы хотите иметь unicode типы, необходимо добавить a u перед символом:

>>> t = [(u'亀',), (u'犬',)]

Но давайте предположим, что Вы на самом деле хотите strs, нет unicodes. Основная проблема, __str__ метод списка (или кортеж) практически равен __repr__ метод (который возвращает строку, которая при оценке создаст точно тот же объект). Поскольку __repr__ метод должен быть независимым от кодирования, строки представлены в самом безопасном возможном режиме, т.е. каждый символ за пределами диапазона ASCII представлен как шестнадцатеричный символ (\xe4, например).

К сожалению, насколько я знаю, нет никакого метода библиотеки для печати списка, который осведомлен о локали. Вы могли использовать функцию почти общего назначения как это:

def collection_str(collection):
    if isinstance(collection, list):
        brackets = '[%s]'
        single_add = ''
    elif isinstance(collection, tuple):
        brackets = '(%s)'
        single_add =','
    else:
        return str(collection)
    items = ', '.join([collection_str(x) for x in collection])
    if len(collection) == 1:
        items += single_add
    return brackets % items

>>> print collection_str(t)
[('亀',), ('犬',)]

Обратите внимание, что это не будет работать на все возможные наборы (наборы и словари, например), но легко расширить его для обработки их.

3
ответ дан 2 December 2019 в 21:24
поделиться

Файлами исходного кода Python является строго ASCII, таким образом, необходимо использовать \u escape-последовательности, если Вы не указываете кодирование. Посмотрите PEP 0263.

#!/usr/bin/python
# coding=utf-8
t = [u'亀', u'犬']
print t

Когда Вы передаете массив print, Python преобразовывает объект в строку с помощью правил Python для преобразований строк. Вывод таких преобразований разработан для eval(), который является, почему Вы видите их \u последовательности. Вот взлом для обхождения этого на основе решения bobince. Консоль должна принять Unicode, или это выдаст исключение.

t = [(u'亀',), (u'犬',)]
print repr(t).decode('raw_unicode_escape')
2
ответ дан 2 December 2019 в 21:24
поделиться

Таким образом, это, кажется, делает то, что я хочу:

print '[%s]' % ', '.join([', '.join('(%s,)' % ', '.join(ti) for ti in t)])


>>> t = [('亀',), ('犬',)]
>>> print t
[('\xe4\xba\x80',), ('\xe7\x8a\xac',)]
>>> print '[%s]' % ', '.join([', '.join('(%s,)' % ', '.join(ti) for ti in t)])
[(亀,), (犬,)]

Конечно, существует лучший способ сделать это.

(но другие два ответа к настоящему времени не приводят к исходной строке, распечатываемой, как желаемый).

1
ответ дан 2 December 2019 в 21:24
поделиться

Попытка:

import codecs, sys
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
0
ответ дан 2 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: