mirror of
https://github.com/esphome/esphome.git
synced 2026-06-24 12:17:23 +00:00
[lvgl] Hoist lazy_once import, document thread-safety
Addresses two stylistic notes on the PR: - Move `from ..helpers import lazy_once` to module scope in widgets/__init__.py. helpers.py only depends on esphome and esphome.const, so there's no circular-import risk that would justify the function-local import. Keep the `from ..schemas import base_update_schema` deferred because schemas.py imports WidgetType from this module. - Document that lazy_once is single-threaded and retries build() on exception (no negative-cache), so future callers know the contract if the helper migrates to esphome/core/helpers.py.
This commit is contained in:
@@ -16,6 +16,11 @@ def lazy_once(build: Callable[[], T]) -> Callable[[], T]:
|
||||
Used to defer voluptuous schema construction until first validation. Many
|
||||
of the lvgl schemas would otherwise be built at module-import time even for
|
||||
YAMLs that never reach them.
|
||||
|
||||
Not thread-safe — concurrent first-callers would each run ``build``. esphome
|
||||
config validation is single-threaded so this is fine in practice. If
|
||||
``build`` raises, the cache stays empty and the next call retries; there is
|
||||
no negative-cache.
|
||||
"""
|
||||
cached: list[T] = []
|
||||
|
||||
|
||||
@@ -48,6 +48,7 @@ from ..defines import (
|
||||
join_enums,
|
||||
literal,
|
||||
)
|
||||
from ..helpers import lazy_once
|
||||
from ..lv_validation import lv_int
|
||||
from ..lvcode import (
|
||||
LvConditional,
|
||||
@@ -80,8 +81,11 @@ def _lazy_update_schema(widget_type: "WidgetType"):
|
||||
voluptuous schemas and is invoked once per WidgetType at import time. The
|
||||
caller (register_action) only needs a validator, so wrap the build in a
|
||||
closure that materialises on the first validation and caches the result.
|
||||
|
||||
The ``from ..schemas import base_update_schema`` import stays inside the
|
||||
closure because ``schemas`` imports ``WidgetType`` from this module — top-
|
||||
level would deadlock the import.
|
||||
"""
|
||||
from ..helpers import lazy_once
|
||||
|
||||
def build():
|
||||
from ..schemas import base_update_schema
|
||||
|
||||
Reference in New Issue
Block a user