如何检查jinja2模板中是否存在给定变量?

时间:2012-12-19 16:24:57

标签: python jinja2

假设我创建了一个模板对象(f.e。使用environment.from_string(template_path))。是否可以检查创建的模板中是否存在给定的变量名称?

我想知道,如果

template.render(x="text for x")

会产生任何影响(如果某些内容实际上被“text for x”替换)。如何检查变量x是否存在?

3 个答案:

答案 0 :(得分:31)

来自文档:

<强>定义(值)

如果定义了变量,则返回true:

{% if variable is defined %}
    value of variable: {{ variable }}
{% else %}
    variable is not defined
{% endif %}
See the default() filter for a simple way to set undefined variables.

编辑: 看来你想知道一个值是否传入渲染上下文。在这种情况下,您可以使用jinja2.meta.find_undeclared_variables,它将返回您要评估的模板中使用的所有变量的列表。

答案 1 :(得分:1)

我不确定这是不是最好的方法,或者它是否适用于所有情况,但我会假设你在字符串中有模板文本,要么是因为你用字符串创建的,要么是你的程序已将源模板读入字符串。

我会使用正则表达式库,重新

>>> import re
>>> template = "{% block body %} This is x.foo: {{ x.foo }} {% endblock %}"
>>> expr = "\{\{.*x.*\}\}"
>>> result = re.search(expr, template)
>>> try: 
>>>     print result.group(0)
>>> except IndexError:
>>>     print "Variable not used"

结果将是:

'{{ x.foo }}'

或抛出我抓到的异常:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: no such group

将打印“未使用变量”

答案 2 :(得分:-4)

你做不到。

我想你可以解析模板,然后走AST,看看是否有引用,但这会是一些复杂的代码。