Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何检查jinja2模板中是否存在给定变量?_Python_Jinja2 - Fatal编程技术网

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

Python 如何检查jinja2模板中是否存在给定变量?,python,jinja2,Python,Jinja2,比如说,我创建了一个模板对象(例如,使用environment.from\u string(template\u path))。是否可以检查所创建的模板中是否存在给定的变量名 我想知道,如果 template.render(x="text for x") 将产生任何影响(如果某些内容实际上被“x文本”替换或不替换)。如何检查变量x是否存在?来自文档: 定义(值) 如果定义了变量,则返回true: {% if variable is defined %} value of variabl

比如说,我创建了一个模板对象(例如,使用
environment.from\u string(template\u path)
)。是否可以检查所创建的模板中是否存在给定的变量名

我想知道,如果

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

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

来自文档:

定义(值)

如果定义了变量,则返回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.
编辑: 您似乎想知道是否有一个值传入了呈现上下文。在这种情况下,您可以使用,它将返回要计算的模板中使用的所有变量的列表。

您不能这样做


我想您可以解析模板,然后遍历AST以查看是否有引用,但这将是一段比较复杂的代码。

我不确定这是不是最好的方法,或者它是否在所有情况下都有效,但我假设您有一个字符串中的模板文本,要么是因为您使用字符串创建了它,要么是因为您的程序已将源模板读入字符串

我会使用正则表达式库re

>>> 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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
索引器:没有这样的组

哪个将打印“未使用变量”

在渲染模板之前还是在模板中检查变量?在渲染之前!我需要检查渲染效果是否有意义…所以你想检查变量x是否在模板中被引用?这正是我想要的。你给我带来了坏消息。你能为这种解析提供一些建议吗?Jinja2可能会解析它,我想知道是否有可能访问这个过程的效果。这与我的意思不完全一样-我需要检查模板文本中是否存在
{{variable}
片段。