Тесты можно использовать для проверки переменной на соответствие общему выражению. Чтобы проверить переменную или выражение, необходимо добавить is
плюс имя теста после переменной. Например, чтобы узнать, определена ли переменная, можно написать name is defined
, которое затем вернет True
или False
в зависимости от того, определено ли имя в текущем контексте шаблона.
Тесты тоже могут принимать аргументы. Если тест принимает только один аргумент, то скобки можно опустить. Например, следующие два выражения делают одно и то же:
{% if loop.index is divisibleby 3 %}
{% if loop.index is divisibleby(3) %}
Тесты в модуле jinja2
работают примерно также как фильтры, различие в том, что у теста нет возможности получить доступ к среде Environment
или контексту и что их нельзя связать цепочкой.
Возвращаемое значение теста должно быть True
или False
. Цель теста - дать разработчикам шаблонов возможность выполнять проверки типов и совместимости.
Вот простой тест, который проверяет, является ли переменная простым числом:
import math def is_prime(n): if n == 2: return True for i in range(2, int(math.ceil(math.sqrt(n))) + 1): if n % i == 0: return False return True
Написанный тест можно зарегистрировать в среде шаблонов, обновив переменную Environment.tests
:
environment.tests['prime'] = is_prime
Затем разработчик шаблонов может использовать тест следующим образом:
{% if 42 is prime %} 42 is a prime number {% else %} 42 is not a prime number {% endif %}
boolean()
является ли объект логическим,callable()
является ли объект функцией,defined()
определена ли переменная,divisibleby()
делится ли переменная на число,eq()
то же самое, что a == b
,escaped()
экранирована ли переменная,even()
четная ли переменная,false()
True
, если объект False
,float()
проверяет на
float`,ge()
то же самое, что a >= b
,gt()
то же самое, что a > b
,in()
наличие переменной в последовательности,integer()
проверяет на int
,iterable()
можно ли итерироваться по объекту,le()
то же самое, что a <= b
,lower()
проверяет на нижний регистр,lt()
то же самое, что a < b
,mapping()
проверяет на словарь,ne()
то же самое, что a != b
,none()
проверяет на None
,number()
проверяет на число,odd()
проверяет на нечетность,sameas()
проверяет адрес памяти,sequence()
проверяет на последовательность,string()
проверяет на строку,true()
True
, если объект True
,undefined()
тест, обратный defined()
,upper()
проверяет на верхний регистр.boolean(value)
:Тест boolean()
возвращает True
, если объект value
является логическим значением.
Новое в версии 2.11.
callable(obj, /)
:Тест callable()
возвращает, является ли объект obj
вызываемым (то есть какой-то функцией).
Обратите внимание, что классы являются вызываемыми, как и экземпляры классов с методом __call__()
.
defined(value)
:Тест defined()
возвращает True
, если переменная value
определена:
{% if variable is defined %} value of variable: {{ variable }} {% else %} variable is not defined {% endif %}
Смотрите фильтр default()
, чтобы узнать простой способ установить неопределенные переменные.
divisibleby(value, num)
:Тест divisibleby()
проверяет, делится ли переменная value
на число num
.
eq(a, b, /)
:Тест eq()
- то же самое, что a == b
.
escaped(value)
:Тест escaped()
проверяет, экранировано ли значение.
even(value)
:Тест even()
возвращает True
, если переменная четная.
false(value)
:Тест false()
возвращает True
, если объект False
.
Новое в версии 2.11.
float(value)
:Тест float()
возвращает True
, если объект является float
.
Новое в версии 2.11.
ge(a, b, /)
:Тест ge()
- то же самое, что a >= b
.
gt(a, b, /)
:Тест gt()
- то же самое, что a > b
.
in(value, seq)
:Тест in()
проверяет вхождение/наличие value
в seq
.
integer(value)
:Тест integer()
возвращает True
, если объект является целым числом.
Новое в версии 2.11.
iterable(value)
:Тест iterable()
Проверяет, можно ли перебирать объект.
le(a, b, /)
:Тест le()
- то же самое, что a <= b
.
lower(value)
:Тест lower()
возвращает True
, если value
в нижнем регистре.
lt(a, b, /)
:Тест lt()
- то же самое, что a < b
.
mapping(value)
:Тест mapping()
возвращает True
, если объект является отображением (словарь и т.д.).
ne(a, b, /)
:Тест ne()
- то же самое, что a != b
.
none(value)
:Тест none()
возвращает True
, если переменная равна None
.
number(value)
:Тест number()
возвращает True
, если переменная является числом.
odd(value)
:Тест odd()
возвращает True
, если переменная нечетная.
sameas(value, other)
:Тест sameas()
проверяет, указывает ли объект value
на тот же адрес памяти, что и другой объект other
:
{% if foo.attribute is sameas false %} 'foo.attribute' на самом деле синглтон `False` {% endif %}
sequence(value)
:Тест sequence()
возвращает True
, если value
является последовательностью.
string(value)
:Тест string()
возвращает True
, если объект является строкой.
true(value)
:Тест true()
возвращает True
, если объект True
.
Новое в версии 2.11.
undefined(value)
:Тест undefined()
работает как defined()
, но наоборот.
upper(value)
:Тест upper()
возвращает True
, если value
записана в верхнем регистре..