65

Jinja2マクロの余分な引数とkwargsはどのように処理されますか?ドキュメントは、手に負えないほど明確ではありません。

たとえば、これは明らかに間違っています。

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

その結果、

jinja2.exceptions.TemplateSyntaxError

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

ドキュメントには次のように書かれています。

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'

私には例がなく、Jinja2のソースコードatmを調べていません。現時点では、ドキュメントは明確ではありません。どんな考えでもありがたいです。

4

1 に答える 1

78

秘訣は、それらを受け入れる必要があるマクロで少なくとも 1 回アクセスkwargsする必要があることです。つまり、マクロ引数リストで宣言せずに、マクロ本体で 1 回呼び出す必要があります。についても同様です。{{ 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 に答える