12 окт. 2009 г.

Шаблонизатор в Tornado и unicode

Шаблонизаторы, основанные на преобразовании кода шаблона в промежуточный питоновский код с последующей его компиляцией, как правило, отличаются простотой реализации и высокой скоростью выполнения. 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, '