【问题标题】:*args, **kwargs in jinja2 macros*args, **kwargs 在 jinja2 宏中
【发布时间】:2012-12-06 08:30:38
【问题描述】:

如何为 Jinja2 宏处理额外的 args 和 kwargs?文档不是很清楚。

例如,这显然是错误的:

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

导致

jinja2.exceptions.TemplateSyntaxError

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

documentation 说:

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 中讨论。目前我还不清楚文档。任何想法表示赞赏。

【问题讨论】:

  • 听起来它可能不支持任意关键字参数。也许例如{% macro example_2(one, two, test=None) %} 或类似的?

标签: python macros jinja2


【解决方案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")}}

【讨论】:

  • 哇,这是一个非常令人反感的设计选择。
  • @BrenBarn - 我必须同意你的观点 - Jinja 中有很多很棒的东西 - 神奇的伪全局变量不属于这一类。
  • 我不会说这是很棒,但至少我们可以将它放在评论中以便在渲染时删除{# {{kwargs}} #}
  • 评论方法对我不起作用。可能是特定于版本的。
  • 你的意思是我应该写{% if False %}{{ kwargs }}{% endif %} 还是泰勒写的版本?哦...
猜你喜欢
  • 1970-01-01
  • 2013-08-04
  • 2020-09-16
  • 2017-01-28
  • 1970-01-01
  • 2017-03-26
  • 2023-04-01
  • 2021-07-26
  • 2022-09-22
相关资源
最近更新 更多