Python Mako还是Jinja2?
我没有找到一个很好的比较金甲2和Mako。你会用什么来完成什么任务Python Mako还是Jinja2?,python,templates,template-engine,mako,jinja2,Python,Templates,Template Engine,Mako,Jinja2,我没有找到一个很好的比较金甲2和Mako。你会用什么来完成什么任务 我个人对mako很满意(在pylons web应用程序环境中),但我很好奇jinja2是否有一些mako没有的好特性/改进-或者可能有缺点?我个人更喜欢Jinja2的语法,而不是Mako的。就拿这个例子来说吧 Jinja2有过滤器,我听说Mako也有,但我没见过。过滤函数的行为与常规函数不同,它们接受被过滤值的隐式第一个参数。因此,在Mako,你可以写: ${escape(default(get_name(user), "No
我个人对mako很满意(在pylons web应用程序环境中),但我很好奇jinja2是否有一些mako没有的好特性/改进-或者可能有缺点?我个人更喜欢Jinja2的语法,而不是Mako的。就拿这个例子来说吧 Jinja2有过滤器,我听说Mako也有,但我没见过。过滤函数的行为与常规函数不同,它们接受被过滤值的隐式第一个参数。因此,在Mako,你可以写:
${escape(default(get_name(user), "No Name"))}
那太可怕了。在Jinja2中,你会写:
{{ user | get_name | default('No Name') | escape }}
在我看来,Jinja2的例子更具可读性。Jinja2的规则性更强,因为标记以一种可预测的方式开始和结束,要么是处理和控制指令的{%}
,要么是输出变量的{}
但这些都是个人喜好。我不知道还有什么更重要的理由选择金甲2号而不是Mako,反之亦然。塔架非常棒,你可以使用任何一个
更新包括Jinja2宏。尽管在任何情况下都是人为的,但在我看来,Jinja2示例更容易阅读和理解。Mako的指导思想是“Python是一种很棒的脚本语言。不要重新发明轮子……你的模板可以处理它!”但是Jinja2的宏(实际上是整个语言)看起来更像Mako使用的Python 看一看示例:
它针对性能(更多和更多)进行了优化,经过了良好的测试和记录。不太公平:您的“Jinja中的等价物”排除了Mako示例中的一半内容,因此看起来更短。Mako的
与
没有那么令人困惑(块与内联代码)。Mako也有过滤函数,它们看起来完全一样。@Jesse:我不喜欢Jinja2坚持(几乎)复制Python。除非将它们作为上下文变量传入,否则不能使用任何,包括len
和enumerate
。而使用。\uuuu len\uuuu
或loop.index0
则是丑陋和不直观的。你如何将jinja过滤器与mako过滤器进行比较,说它们“更好”,但“你还没见过”mako过滤器?这似乎很不合理。我们对过滤器使用与Jinja几乎相同的语法:${user | get_name,default('No name'),escape}
。很明显,您从未使用过Mako,它非常好,但您几乎无法进行合理的比较,或者称我们的语法为“愚蠢”,谢谢!几个月前我写了这篇文章,从那时起我就阅读了Mako过滤语法。我从来没有说它愚蠢,但我确实质疑Mako团队做出的许多设计决策。在我看来,Jinja的设计目的是尽可能快地学习,所需的文档旅行最少。Mako并非如此,它表现出任意和不一致的语法。我可以用它来评判Mako;够了,我觉得这不适合我。顺便说一句,引号用来引用实际说的话。你的意思是我说一个更好或者一个愚蠢,但我两个都没说。@Jessedhilon:事实上,你说的是“你提供的例子进一步证明了Mako在句法上是愚蠢的”。无论如何,由于PyCharm在2.0版中增加了对Mako和Jinja2的支持,也许我们应该从他们的开发人员那里得到关于语法复杂性的结论:DIt看起来不错,但pip上可用的版本已经过时了:smx是最小的代码库,易于理解和扩展:%define(make_row,%for(行中的名称,%name%))%set(正文,%for(行中的行,%makerow%))%expand(%include(base.html))
${escape(default(get_name(user), "No Name"))}
{{ user | get_name | default('No Name') | escape }}
@require(user, items)
Welcome, @user.name!
@if items:
@for i in items:
@i.name: @i.price!s.
@end
@else:
No items found.
@end