宏怎么定义、怎么传内容、怎么接收可变参数?能不能读调用处的变量?在大循环里用宏会不会慢?这篇把宏的每个规则都跑一遍,再测它的代价。
宏定义(forms.html 节选): {% macro input(name, value="", type="text", cls="input") -%}<input type="{{ type }}" name="{{ name }}" value="{{ value }}" class="{{ cls }}">{%- endmacro %}
use.html → <input type="text" name="user" value="" class="input">|<input type="password" name="pw" value="" class="big">
use_from.html → <input type="text" name="a" value="<x>" class="input">|<div class="card"><h3>标题</h3>正文2</div>
inline.html → 你好,世界|你好,ann|你好,bob上一篇:Markup 与 safe;下一篇:模板中的惰性对象。宏与全局的可见性差别见自定义 Template Global。
caller_args.html → <tr><td>1:10</td></tr><tr><td>2:20</td></tr> card 宏里用 caller() 包裹正文(见 use_from.html 输出)
在签名里写 *args → TemplateSyntaxError: expected token 'name', got '*'
list_all(1, 2, k=3) → args=[1, 2]|kwargs={'k': 3}
fact(5) → 120
with_defaults(1) → a=1,b=2,c=1 (默认值表达式可以引用前面的参数)
宏的属性 name / arguments / defaults / catch_kwargs / catch_varargs / caller: m|('a', 'b')||True|True|False 同一个模板里定义的宏读外层的 {% set x %}: 外层
import 默认 vs with context: [看不到 outer_var]|[外层变量] <b><i></b>|<B><I></B>|16
不加括号 {{ m }} 输出的是宏对象: <Macro 'm'> 直接写 0.986 ms/次
同模板里的宏(1500 次调用) 3.236 ms/次
import 进来的宏(1500 次调用) 3.234 ms/次
每行 include 一个模板(500 次) 2.083 ms/次
相对直接写: {'直接写': '1.00×', '同模板里的宏(1500 次调用)': '3.28×', 'import 进来的宏(1500 次调用)': '3.28×', '每行 include 一个模板(500 次)': '2.11×'}