
* raise error when passing a str(var) * make it faster * fix typo * fix tests * mocker consistency Co-authored-by: Thomas Brandého <thomas.brandeho@gmail.com> * ditto Co-authored-by: Thomas Brandého <thomas.brandeho@gmail.com> --------- Co-authored-by: Thomas Brandého <thomas.brandeho@gmail.com>
26 lines
568 B
Python
26 lines
568 B
Python
"""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
|