12345678910111213141516171819202122232425 |
- """Decorator utilities."""
- from typing import Callable, TypeVar
- T = TypeVar("T")
- def once(f: Callable[[], T]) -> Callable[[], T]:
- """A decorator that calls the function once and caches the result.
- Args:
- f: The function to call.
- Returns:
- A function that calls the function once and caches the result.
- """
- unset = object()
- value: object | T = unset
- def wrapper() -> T:
- nonlocal value
- value = f() if value is unset else value
- return value # pyright: ignore[reportReturnType]
- return wrapper
|