【问题标题】:Jinja2 getting syntax error Python generatorJinja2得到语法错误Python生成器
【发布时间】:2021-12-05 12:49:08
【问题描述】:

下面是我的代码。我收到语法错误,但在 Python 中没有这样的问题

{% for stud in  [dict(item.split("=") for item in item.split(",")) for item in item.split(";")] %}
  print {"hi"}
{% endfor %}

例外:

Syntax error in jinja2 template: expected token ',', got 'for'

示例输入:

studId=ValueA,studName=valueB;studId=ValueC,studName=ValueD

Python 中使用的示例代码:

item = "studId=ValueA,studName=valueB;studId=ValueC,studName=ValueD"


for stud in [dict(item.split("=") for item in item.split(",")) for item in item.split(";")]:
  print(stud['studName'])

样本输出:

valueB
ValueD

【问题讨论】:

  • jinja 不是 python,你不能指望在里面使用 python 代码
  • 如果您能提供示例输入和所需输出,将会很有帮助。例如,item = 'key1=val1;key2=val2' 在这种情况下似乎是一个示例输入。
  • 注意到了。你能告诉我怎么做吗?我是新手
  • @rv.kvetch,我已经用 python 中的示例输入、示例输出和示例代码更新了我的问题

标签: python ansible jinja2


【解决方案1】:

至少从我注意到的情况来看,jinja 似乎不是support list comprehensions

我测试过的解决方法是pass in a function,它对 Jinja2 执行列表理解,然后可以用来渲染模板:

import jinja2


item = "studId=ValueA,studName=valueB;studId=ValueC,studName=ValueD"


def get_values(values):
    return [dict(v.split("=") for v in v.split(",")) for v in values.split(";")]


ts = """\
{% for value in get_values(values) -%}
  {{ value.studName }}
{% endfor %}\
"""

fields = {'get_values': get_values, 'values': item}

rendered = jinja2.Template(ts).render(**fields)

输出:

>>> rendered
'valueB\nValueD\n'

【讨论】:

  • 所以没有其他选择
  • 好吧,你可以环顾四周,也许可以尝试谷歌搜索以寻找解决方法。不过,我知道如果您将列表理解转换为嵌套的 for 循环,它可能会起作用。
  • 我能知道我的 jinja2 模板如何调用你的代码吗?我需要将 jinja2 的值传递给你的 python
  • @josh 我不太明白
  • 让我解释一下它是如何工作的。在我的 Ansible 变量中,我会将 studIdf 和 studName 传递给 jinja2 模板。如果我想为每个循环调用 jinja2 调用 python 脚本,可以吗? python 像函数一样返回值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-07
  • 1970-01-01
  • 2020-08-22
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
相关资源
最近更新 更多