假设我创建了一个模板对象(f.e。使用environment.from_string(template_path)
)。是否可以检查创建的模板中是否存在给定的变量名称?
我想知道,如果
template.render(x="text for x")
会产生任何影响(如果某些内容实际上被“text for x”替换)。如何检查变量x是否存在?
答案 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,看看是否有引用,但这会是一些复杂的代码。