From 0e95875912e22d6b6dc5ffb7be62a839eafa80c7 Mon Sep 17 00:00:00 2001 From: Marc Mueller <30130371+cdce8p@users.noreply.github.com> Date: Tue, 13 Dec 2022 15:22:23 +0100 Subject: [PATCH] Improve ignore_variance typing (#83927) --- homeassistant/util/variance.py | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) 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)