odd get_template even async python macros jinja2

python - get_template - * args,** kwargs en macros jinja2



jinja2 list (1)

¿Cómo se manejan los args y kwargs adicionales para una macro Jinja2? La documentación no es exactamente clara.

Por ejemplo, esto es claramente incorrecto:

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

lo que resulta en

jinja2.exceptions.TemplateSyntaxError TemplateSyntaxError: expected token ''name'', got ''**''

La documentación dice:

kwargs

Al igual que varargs, pero para los argumentos de palabras clave. Todos los argumentos de palabra clave no consumidos se almacenan en esta variable especial.

Desafortunadamente, cualquier combinación de argumentos de palabras clave adicionales es un error,

{% 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''

No tengo ejemplos y no estoy hurgando en el código fuente de Jinja2 atm. La documentación no está clara para mí en este punto. Cualquier pensamiento apreciado.


El truco es que se debe acceder a los kwargs al menos una vez en cualquier macro que los acepte. Es decir, debe llamar a {{ kwargs }} una vez en macro cuerpo sin declararlo en la lista de argumentos de macros. Lo mismo es cierto para {{ varargs }} .

Esto no funcionará

{% macro example_2(one, two) %} * {{one}} - {{two}} {% endmacro %} {{example_2(1, 2, test="Hello")}}

Esta voluntad

{% macro example_2(one, two) %} * {{one}} - {{two}} * {{kwargs}} {% endmacro %} {{example_2(1, 2, test="Hello")}}