Python *args,**kwargs在jinja2宏中

Python *args,**kwargs在jinja2宏中,python,macros,jinja2,Python,Macros,Jinja2,如何处理Jinja2宏的额外args和kwargs?文档不是很清楚 例如,这显然是错误的: {% macro example_1(one, two, **kwargs) %} do macro stuff {% endmacro %} 导致 jinja2.exceptions.TemplateSyntaxError TemplateSyntaxError: expected token 'name', got '**' 报告说: 夸尔斯 与varargs类似,但用于关键字参数。所有

如何处理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中翻找。我现在还不清楚文档。任何想法都值得欣赏。

诀窍在于,在任何应该接受它们的宏中,
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")}}

听起来它可能不支持任意关键字参数。也许例如,
{%macro example_2(一,二,test=None)%}
或类似的?哇,这是一个非常令人厌恶的设计选择。@BrenBarn-我不得不同意你的看法-Jinja中有很多很棒的东西-神奇的伪球形不属于这一类。我不会说这是很棒的,但至少我们可以把它放在一个注释中,在渲染时去掉它。
{{{kwargs}}
注释方法对我不起作用。可能是版本特定的。你是说我应该写
{%if False%}{{kwargs}{%endif%}
还是泰勒写的版本?哦