-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Closed
Labels
bugmypy got something wrongmypy got something wrongtopic-type-contextType context / bidirectional inferenceType context / bidirectional inferencetopic-type-variables
Description
Bug Report
mypy cannot infer typevar which is defined as the function parameter, even though it could be evaluated from the following decorated function
To Reproduce
import functools
import time
from typing import Callable, ParamSpec, TypeVar, Any
_P = ParamSpec("_P")
_T = TypeVar("_T")
def retry(
max_retry: int = 3,
interval: int = 1,
should_retry: Callable[[_T], bool] | None = None,
) -> Callable[[Callable[_P, _T]], Callable[_P, _T]]:
def decorator(func: Callable[_P, _T]) -> Callable[_P, _T]:
@functools.wraps(func)
def wrapper(*args: _P.args, **kwargs: _P.kwargs) -> _T:
failed_cnt = 0
while True:
try:
result = func(*args, **kwargs)
if should_retry is not None and should_retry(result):
raise ValueError("result is not expected")
return result
except Exception as e:
failed_cnt += 1
if failed_cnt > max_retry:
e.add_note(f"Retry {max_retry} times failed.")
raise e
time.sleep(interval)
return wrapper
return decorator
@retry() # Argument 1 has incompatible type "Callable[[int], int]"; expected "Callable[[int], Never]"
def f(x: int) -> int:
return x
if __name__ == "__main__":
f(1)Expected Behavior
no error
Actual Behavior
Argument 1 has incompatible type "Callable[[int], int]"; expected "Callable[[int], Never]"
Your Environment
- Mypy version used: 1.15.0
- Python version used: 3.12
Metadata
Metadata
Assignees
Labels
bugmypy got something wrongmypy got something wrongtopic-type-contextType context / bidirectional inferenceType context / bidirectional inferencetopic-type-variables