From 6923fb16014097f35c6c20ae9bcadb1b69cbaadb Mon Sep 17 00:00:00 2001 From: "J. Nick Koston" Date: Fri, 24 May 2024 17:44:02 -1000 Subject: [PATCH] Avoid template context manager overhead when template is already compiled (#118079) --- homeassistant/helpers/template.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/homeassistant/helpers/template.py b/homeassistant/helpers/template.py index 131a51cb6ff..8f150ddaf6c 100644 --- a/homeassistant/helpers/template.py +++ b/homeassistant/helpers/template.py @@ -511,11 +511,15 @@ class Template: def ensure_valid(self) -> None: """Return if template is valid.""" + if self.is_static or self._compiled_code is not None: + return + + if compiled := self._env.template_cache.get(self.template): + self._compiled_code = compiled + return + with _template_context_manager as cm: cm.set_template(self.template, "compiling") - if self.is_static or self._compiled_code is not None: - return - try: self._compiled_code = self._env.compile(self.template) except jinja2.TemplateError as err: @@ -2733,7 +2737,7 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment): super().__init__(undefined=make_logging_undefined(strict, log_fn)) self.hass = hass self.template_cache: weakref.WeakValueDictionary[ - str | jinja2.nodes.Template, CodeType | str | None + str | jinja2.nodes.Template, CodeType | None ] = weakref.WeakValueDictionary() self.add_extension("jinja2.ext.loopcontrols") self.filters["round"] = forgiving_round @@ -3082,10 +3086,9 @@ class TemplateEnvironment(ImmutableSandboxedEnvironment): defer_init, ) - if (cached := self.template_cache.get(source)) is None: - cached = self.template_cache[source] = super().compile(source) - - return cached + compiled = super().compile(source) + self.template_cache[source] = compiled + return compiled _NO_HASS_ENV = TemplateEnvironment(None)