* args, * * kwargs в макросах jinja2


как дополнительные args & kwargs обрабатываются для макроса Jinja2? Документация не совсем ясна навскидку.

например, это явно не так:

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

что приводит к

jinja2.exceptions.TemplateSyntaxError

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

The документация говорит:

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. На данный момент документация мне не ясна. Любые мысли оценены.

1 52

1 ответ:

фишка в том, что 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")}}