diff --git a/homeassistant/util/variance.py b/homeassistant/util/variance.py index 626b111817f..2e0835d1cfe 100644 --- a/homeassistant/util/variance.py +++ b/homeassistant/util/variance.py @@ -6,36 +6,39 @@ from datetime import datetime, timedelta import functools from typing import Any, TypeVar, overload -T = TypeVar("T", int, float, datetime) +from typing_extensions import ParamSpec + +_R = TypeVar("_R", int, float, datetime) +_P = ParamSpec("_P") @overload def ignore_variance( - func: Callable[..., int], ignored_variance: int -) -> Callable[..., int]: + func: Callable[_P, int], ignored_variance: int +) -> Callable[_P, int]: ... @overload def ignore_variance( - func: Callable[..., float], ignored_variance: float -) -> Callable[..., float]: + func: Callable[_P, float], ignored_variance: float +) -> Callable[_P, float]: ... @overload def ignore_variance( - func: Callable[..., datetime], ignored_variance: timedelta -) -> Callable[..., datetime]: + func: Callable[_P, datetime], ignored_variance: timedelta +) -> Callable[_P, datetime]: ... -def ignore_variance(func: Callable[..., T], ignored_variance: Any) -> Callable[..., T]: +def ignore_variance(func: Callable[_P, _R], ignored_variance: Any) -> Callable[_P, _R]: """Wrap a function that returns old result if new result does not vary enough.""" - last_value: T | None = None + last_value: _R | None = None @functools.wraps(func) - def wrapper(*args: Any, **kwargs: Any) -> T: + def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _R: nonlocal last_value value = func(*args, **kwargs)