Improve ignore_variance typing (#83927)

This commit is contained in:
Marc Mueller 2022-12-13 15:22:23 +01:00 committed by GitHub
parent 9f67eb1aaa
commit 0e95875912
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -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)