*args,**jinja2宏中的kwargs

blu*_*ank 56 python macros jinja2

如何为Jinja2宏处理额外的args和kwargs?文档不是很清楚.

例如,这显然是错误的:

{% macro example_1(one, two, **kwargs) %}
    do macro stuff
{% endmacro %}
Run Code Online (Sandbox Code Playgroud)

结果

jinja2.exceptions.TemplateSyntaxError

TemplateSyntaxError: expected token 'name', got '**'
Run Code Online (Sandbox Code Playgroud)

文件说:

kwargs

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'
Run Code Online (Sandbox Code Playgroud)

我没有例子,也没有在Jinja2源代码atm中讨论.此时我不清楚文档.任何想法都赞赏.

Sea*_*ira 64

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

这不行

{% macro example_2(one, two) %}
    * {{one}} - {{two}}
{% endmacro %}
{{example_2(1, 2, test="Hello")}}
Run Code Online (Sandbox Code Playgroud)

这将

{% macro example_2(one, two) %}
    * {{one}} - {{two}}
    * {{kwargs}}
{% endmacro %}
{{example_2(1, 2, test="Hello")}}
Run Code Online (Sandbox Code Playgroud)

  • 哇,这是一个非常令人反感的设计选择. (56认同)
  • 你是说我应该写`{%if False%} {{kwargs}} {%endif%}`或泰勒写的版本?哦... (4认同)
  • @BrenBarn - 我必须同意你的观点 - 在Jinja中有很多令人敬畏的东西 - 神奇的伪全局变量不属于那个类别. (3认同)
  • 我不会声称这是*伟大的*,但至少我们可以把它放在评论中以便在渲染时被剥离`{# {{kwargs}} #}` (2认同)