65

Jinja2 宏如何处理额外的 args 和 kwargs?文档并不完全清楚。

例如,这显然是错误的:

{% macro example_1(one, two, **kwargs) %}
    do macro stuff
{% endmacro %}

这导致

jinja2.exceptions.TemplateSyntaxError

TemplateSyntaxError: expected token 'name', got '**'

文档说:

夸格斯

varargs类似,但用于关键字参数。所有未使用的关键字参数都存储在这个特殊变量中。

不幸的是,任何额外关键字参数的组合都是错误的,

{% macro example_2(one, two) %}
    do macro stuff
{% endmacro %}

{{ example_2(one, two, test='test') }}

TypeError: macro 'example_2' takes no keyword keyword argument 'test'

我没有示例,也没有在 Jinja2 源代码 atm 中讨论。目前我还不清楚文档。任何想法表示赞赏。

4

1 回答 1

78

诀窍是kwargs必须在任何应该接受它们的宏中至少访问一次。也就是说,你必须{{ kwargs }}在宏体中调用一次,而不在宏参数列表中声明它。对于{{ varargs }}.

这行不通

{% macro example_2(one, two) %}
    * {{one}} - {{two}}
{% endmacro %}
{{example_2(1, 2, test="Hello")}}

这会

{% macro example_2(one, two) %}
    * {{one}} - {{two}}
    * {{kwargs}}
{% endmacro %}
{{example_2(1, 2, test="Hello")}}
于 2012-12-19T03:05:18.680 回答