Как проверить, существует ли данная переменная в шаблоне jinja2?

Скажем, я создал объект шаблона (например, используя environment.from_string(template_path)). Можно ли проверить, существует ли данное имя переменной в созданном шаблоне?

Я хотел бы знать, если

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

будет иметь какой-либо эффект (если что-то будет заменено на "text for x" или нет). Как проверить, существует ли переменная x?

Ответ 1

Из документации:

определен (значение)

Возвращает 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.

EDIT: Кажется, вы хотите знать, было ли передано значение в контексте рендеринга. В этом случае вы можете использовать jinja2.meta.find_undeclared_variables, который вернет вам список всех переменных, используемых в шаблонах, которые будут оцениваться.

Ответ 2

Я не уверен, что это лучший способ, или если он будет работать во всех случаях, но я предполагаю, что у вас есть текст шаблона в строке, потому что вы создали его с помощью строки или вашего программа прочитала исходный шаблон в строке.

Я бы использовал библиотеку регулярных выражений, 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

который будет печатать "Variable not used"

Ответ 3

Вы не можете этого сделать.

Я предполагаю, что вы можете проанализировать шаблон, а затем пройти АСТ, чтобы увидеть, есть ли ссылки, но это будет несколько сложный код.