Функция lazy

Функция lazy применяется для создания отложенных объектов, которые вычисляются только в момент доступа к их значению. Это особенно полезно при работе с шаблонами и формами, где необходимо передавать вызовы функций, которые должны выполниться позднее. Функция принимает вызываемый объект и возвращает обёртку, которая при обращении вызывает исходный объект с переданными аргументами.

Синтаксис

pythonfrom django.utils.functional import lazy

lazy(func, *resultclasses)(*args, **kwargs)

Параметры

Функция lazy принимает два основных аргумента:

func - вызываемый объект, выполнение которого будет отложено до момента обращения к результату.

resultclasses - список классов, которые определяют тип возвращаемого значения и поведение при операциях сравнения или преобразования.

Пример

Давайте создадим отложенную функцию, которая возвращает текущее время только при обращении к результату:

pythonfrom django.utils.functional import lazy
from datetime import datetime

def get_current_time():
  return datetime.now().strftime("%H:%M:%S")

lazy_time = lazy(get_current_time, str)()

# Функция не выполнилась при создании
# Выполнится только при обращении
print(lazy_time)

Результат выполнения кода:

python"14:25:30"

Пример

Давайте используем lazy для передачи отложенного вызова в модель с помощью поля по умолчанию:

pythonfrom django.db import models
from django.utils.functional import lazy
from datetime import datetime

def get_default_date():
  return datetime.now().date()

class Article(models.Model):
  title = models.CharField(max_length=100)
  created_at = models.DateField(
    default=lazy(get_default_date, datetime)
  )
  
  def __str__(self):
    return self.title

Результат выполнения кода при создании объекта:

pythonfrom myapp.models import Article

article = Article(title="New Article")
print(article.created_at)

Результат выполнения кода:

python"2026-09-07"

Пример

Давайте создадим отложенную строку с преобразованием регистра для использования в шаблонах:

pythonfrom django.utils.functional import lazy

def process_text(text):
  return text.strip().upper()

lazy_text = lazy(process_text, str)("  hello world  ")

# Выполнится только при обращении
print(lazy_text)

Результат выполнения кода:

python"HELLO WORLD"

Смотрите также

  • функция mark_safe,
    которая помечает строку как безопасную для вывода в HTML
  • функция escape,
    которая экранирует специальные HTML-символы
  • функция format_html,
    которая форматирует строку с безопасным HTML-выводом
  • декоратор cached_property,
    который кеширует результат выполнения метода