Шаблонизаторы, основанные на преобразовании кода шаблона в промежуточный питоновский код с последующей его компиляцией, как правило, отличаются простотой реализации и высокой скоростью выполнения. Tornado не исключение. Однако при использовании такого подхода возникает проблема со строками. Как бы меня не уверяли некоторые коллеги, я не верю, что верстальщику будет приятно писать в шаблоне строки в виде
u'...'
. Но если этого не делать, то придётся работать с 8-битными строками в некоторой кодировке, как правило UTF-8, со всеми вытекающими последствиями. Одного len()
вполне достаточно. Кроме того, не хотелось бы иметь жёстко зафиксированную кодировку, пока возникает необходимость взаимодествия с сервисами компаний (вроде Яndex), не подозревающих о наличие других кодировок, кроме windows-1251.При переходе на Python 3 всё станет работать так, как нужно. Но пока многие важные библиотеки ещё с ним не работают, приходится искать другие решения. Когда-то давно я проходил по AST и заменял все
str
на unicode
, оставляя нетронутыми строки, содержащие только символы ASCII (это было необходимо, чтобы работали именованные аргументы). Но в Python 2.6 появилась возможность сделать from __future__ import unicode_literals
. Для шаблонизатора же достаточно просто использовать соответствующий флаг при компиляции:
source = u'print repr("абв")'
code = compile(source, '', 'exec',
__future__.unicode_literals.compiler_flag)
exec code
При выполнении этот код выведет u'\u0430\u0431\u0432'
.
1 комментарий:
Отправить комментарий