2024-04-25 12:17:26 发布
网友
我没有找到一个很好的比较金贾2和Mako。你会用什么做什么工作?
我个人对mako(在pylons web app上下文中)很满意,但很想知道jinja2是否有一些mako没有的好特性/改进?-或者是负面影响?-
看看wheezy.template示例:
@require(user, items) Welcome, @user.name! @if items: @for i in items: @i.name: @i.price!s. @end @else: No items found. @end
它针对性能(更多here和here)进行了优化,并对进行了测试和记录。
我个人更喜欢Jinja2的语法,而不是Mako的语法
<%inherit file="base.html"/> <% rows = [[v for v in range(0,10)] for row in range(0,10)] %> <table> % for row in rows: ${makerow(row)} % endfor </table> <%def name="makerow(row)"> <tr> % for name in row: <td>${name}</td>\ % endfor </tr> </%def>
这里有太多的结构,在我开始之前我必须查阅文档。哪些标记以<%开头,以/>结尾?哪些可以用%>关闭?当我想输出变量(${foo})时,为什么还有其他方法输入模板语言?这个fauxXML有什么用,其中一些指令像标记一样关闭并有属性?
<%
/>
%>
${foo}
这是Jinja2中的等效示例:
{% extends "base.html" %} <table> {% for row in rows %} {{ makerow(row) }} {% endfor %} </table> {% macro make_row(row) %} <tr> {% for name in row %} <td>{{ name }}</td> {% endfor %} </tr> {% endmacro %}
Jinja2有过滤器,据说Mako也有,但我没见过。过滤函数不像常规函数,它们接受被过滤值的隐式第一个参数。因此,在Mako中,您可以写:
${escape(default(get_name(user), "No Name"))}
太可怕了。在Jinja2你会写:
{{ user | get_name | default('No Name') | escape }}
在我看来,Jinja2的例子更具可读性。Jinja2的规则性更强,因为标记以可预测的方式开始和结束,要么使用{% %}来处理和控制指令,要么使用{{ }}来输出变量。
{% %}
{{ }}
但这些都是个人喜好。我不知道还有什么更重要的理由来选择金贾2而不是马科,反之亦然。而且塔架足够大,你可以使用任何一个!
更新包含Jinja2宏。尽管在任何情况下都是人为的,但在我看来,Jinja2示例更容易阅读和理解。Mako的指导思想是“Python是一种很棒的脚本语言。不要重新发明轮子…你的模板可以处理它!”但是Jinja2的宏(实际上是整个语言)看起来更像Mako所做的Python!
看看wheezy.template示例:
它针对性能(更多here和here)进行了优化,并对进行了测试和记录。
我个人更喜欢Jinja2的语法,而不是Mako的语法
这里有太多的结构,在我开始之前我必须查阅文档。哪些标记以
<%
开头,以/>
结尾?哪些可以用%>
关闭?当我想输出变量(${foo}
)时,为什么还有其他方法输入模板语言?这个fauxXML有什么用,其中一些指令像标记一样关闭并有属性?这是Jinja2中的等效示例:
Jinja2有过滤器,据说Mako也有,但我没见过。过滤函数不像常规函数,它们接受被过滤值的隐式第一个参数。因此,在Mako中,您可以写:
太可怕了。在Jinja2你会写:
在我看来,Jinja2的例子更具可读性。Jinja2的规则性更强,因为标记以可预测的方式开始和结束,要么使用
{% %}
来处理和控制指令,要么使用{{ }}
来输出变量。但这些都是个人喜好。我不知道还有什么更重要的理由来选择金贾2而不是马科,反之亦然。而且塔架足够大,你可以使用任何一个!
更新包含Jinja2宏。尽管在任何情况下都是人为的,但在我看来,Jinja2示例更容易阅读和理解。Mako的指导思想是“Python是一种很棒的脚本语言。不要重新发明轮子…你的模板可以处理它!”但是Jinja2的宏(实际上是整个语言)看起来更像Mako所做的Python!
相关问题 更多 >
编程相关推荐