Мако шаблон в зависимости от класса объекта? - PullRequest
0 голосов
/ 22 апреля 2010

Что такое чистый способ использования различных шаблонов в зависимости от класса объекта? кроме как Buncha, если заявления

1 Ответ

2 голосов
/ 22 апреля 2010

Вы можете сделать dict, назвать его type2templ, с типами (то есть, классами) в качестве ключей и экземплярами mako.template.Template в качестве значений - тогда

t = type2templ.get(type(theobj), default_templ)
... t.render() ...

Предполагается, что theobj является экземпляром класса нового стиля (не устаревшие, лучше всего избегаемые "устаревшие" классы, которые по-прежнему используются по умолчанию в Python 2 - если вы используете эти вам следует определенно обновить код до классов нового стиля, но использование theobj.__class__ - это работоспособная, хотя и хакерская, замена для type(theobj) здесь). default_templ - это экземпляр шаблона по умолчанию, который используется для «ничего из вышеперечисленного» (если вы предпочитаете исключение, когда theobj относится к нераспознанному типу, используйте индексирование в квадратных скобках вместо вызова .get ).

Обратите внимание, что это (напрямую) не "поддерживает наследование" - если (например) класс foo отображается в type2templ на шаблон bar, то вы создаете подкласс baz из foo но не записывайте явно в type2templ, какой шаблон должны использовать его экземпляры, вы получите шаблон по умолчанию для экземпляров baz. Поддержка наследования является более сложной - если только вы не сделаете экземпляр шаблона mako одним из атрибутов класса, конечно, что делает его тривиальным (просто theobj.thetempl, если вы называете этот атрибут thetempl! -), но я понимаю, что отделить вид от модели.

...