Это было самое простое: у Heroku не было $FLASK_APP
в переменных промежуточной среды. Добавление позволило запустить инструмент командной строки.
но то, что я хочу видеть распечатанный, удивление:
[(' 亀 '), (' 犬 ')]
Что Вы хотите видеть, что это распечатало на? Поскольку, если это - консоль, это нисколько не гарантировало, что Ваша консоль может отобразить те символы. Поэтому 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 ведет себя точно, как Вы хотите:
Python 3.0 является немного новым и не так хорошо поддерживаемый библиотеками, но он мог бы хорошо удовлетворить Вашим потребностям лучше.
Во-первых, в Вашем сообщении существует небольшое недоразумение. Если Вы определяете список как это:
>>> t = [('亀',), ('犬',)]
... это не unicode
s Вы определяют, но str
s. Если Вы хотите иметь unicode
типы, необходимо добавить a u
перед символом:
>>> t = [(u'亀',), (u'犬',)]
Но давайте предположим, что Вы на самом деле хотите str
s, нет unicode
s. Основная проблема, __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)
[('亀',), ('犬',)]
Обратите внимание, что это не будет работать на все возможные наборы (наборы и словари, например), но легко расширить его для обработки их.
Файлами исходного кода 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')
Таким образом, это, кажется, делает то, что я хочу:
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)])
[(亀,), (犬,)]
Конечно, существует лучший способ сделать это.
(но другие два ответа к настоящему времени не приводят к исходной строке, распечатываемой, как желаемый).
Попытка:
import codecs, sys
sys.stdout = codecs.getwriter('utf8')(sys.stdout)