* args, ** kwargs в макросах jinja2
Как дополнительные аргументы и kwargs обрабатываются для макроса Jinja2? Документация не совсем понятна.
Например, это явно неверно:
{% 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. В настоящее время документация мне не ясна. Любые мысли оценили.
Ответы
Ответ 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")}}