-
-
Notifications
You must be signed in to change notification settings - Fork 33.2k
/
Copy pathvariance.py
47 lines (32 loc) · 1.16 KB
/
variance.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
"""Util functions to help filter out similar results."""
from __future__ import annotations
from collections.abc import Callable
from datetime import datetime, timedelta
import functools
from typing import Any, overload
@overload
def ignore_variance[**_P](
func: Callable[_P, int], ignored_variance: int
) -> Callable[_P, int]: ...
@overload
def ignore_variance[**_P](
func: Callable[_P, float], ignored_variance: float
) -> Callable[_P, float]: ...
@overload
def ignore_variance[**_P](
func: Callable[_P, datetime], ignored_variance: timedelta
) -> Callable[_P, datetime]: ...
def ignore_variance[**_P, _R: (int, float, datetime)](
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: _R | None = None
@functools.wraps(func)
def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _R:
nonlocal last_value
value = func(*args, **kwargs)
if last_value is not None and abs(value - last_value) < ignored_variance:
return last_value
last_value = value
return value
return wrapper