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