* args, ** kwargs в макросах jinja2 - программирование
Подтвердить что ты не робот

* 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. В настоящее время документация мне не ясна. Любые мысли оценили.

4b9b3361

Ответ 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")}}