Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Mako还是Jinja2?_Python_Templates_Template Engine_Mako_Jinja2 - Fatal编程技术网

Python Mako还是Jinja2?

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

我没有找到一个很好的比较金甲2和Mako。你会用什么来完成什么任务


我个人对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