We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Bug Report
mypy failed to return the correct overloaded func type when decorate func accepts more than one parameter.
To Reproduce
from functools import wraps from typing import overload, Any, TypeVar, Callable, Type from typing_extensions import ParamSpec, reveal_type @overload def foo(a: str, /) -> str: pass @overload def foo(a: int, /) -> int: pass def foo(a: Any) -> Any: return a P = ParamSpec("P") T = TypeVar("T") R = TypeVar("R") def forbid_return_type( func: Callable[P, T], tp: Type[Any], /, ) -> Callable[P, T]: @wraps(func) def wrapper(*args: P.args, **kwargs: P.kwargs) -> T: result = func(*args, **kwargs) if isinstance(result, tp): raise TypeError(f"Return type {tp} is forbidden") return result return wrapper foo_as_int = forbid_return_type(foo, str) reveal_type(foo_as_int(1)) reveal_type(foo_as_int("1"))
Expected Behavior
note: Revealed type is "builtins.int" note: Revealed type is "builtins.str"
Actual Behavior
note: Revealed type is "builtins.str" error: Argument 1 has incompatible type "int"; expected "str" [arg-type] note: Revealed type is "builtins.str"
Your Environment
mypy.ini
Both codes bellow work as expected:
from functools import wraps from typing import overload, Any, TypeVar, Callable from typing_extensions import ParamSpec, reveal_type @overload def foo(a: str, /) -> str: pass @overload def foo(a: int, /) -> int: pass def foo(a: Any) -> Any: return a P = ParamSpec("P") T = TypeVar("T") R = TypeVar("R") def forbid_return_type( func: Callable[P, T], ) -> Callable[P, T]: @wraps(func) def wrapper(*args: P.args, **kwargs: P.kwargs) -> T: result = func(*args, **kwargs) return result return wrapper foo_as_int = forbid_return_type(foo) reveal_type(foo_as_int(1)) reveal_type(foo_as_int("1"))
from functools import wraps from typing import Any, TypeVar, Callable, Type, Union from typing_extensions import ParamSpec, reveal_type def foo(a: Union[int, str]) -> Union[int, str]: return a P = ParamSpec("P") T = TypeVar("T") R = TypeVar("R") def forbid_return_type( func: Callable[P, T], tp: Type[Any], /, ) -> Callable[P, T]: @wraps(func) def wrapper(*args: P.args, **kwargs: P.kwargs) -> T: result = func(*args, **kwargs) if isinstance(result, tp): raise TypeError(f"Return type {tp} is forbidden") return result return wrapper foo_as_int = forbid_return_type(foo, str) reveal_type(foo_as_int(1)) reveal_type(foo_as_int("1"))
So it's not working only when the function accepts an overloaded function and another argument.
I checked with pyright and it correctly handles code.
pyright
/Users/yuriikarabas/projects/mypy/temp.py:45:13 - information: Type of "foo_as_int(1)" is "int" /Users/yuriikarabas/projects/mypy/temp.py:46:13 - information: Type of "foo_as_int("1")" is "str" 0 errors, 0 warnings, 2 informations
The text was updated successfully, but these errors were encountered:
I guess issue is here:
mypy/mypy/checkexpr.py
Lines 1399 to 1401 in 6759dbd
Sorry, something went wrong.
#13540 looks related
No branches or pull requests
Bug Report
mypy failed to return the correct overloaded func type when decorate func accepts more than one parameter.
To Reproduce
Expected Behavior
Actual Behavior
Your Environment
mypy.ini
(and other config files): -Both codes bellow work as expected:
So it's not working only when the function accepts an overloaded function and another argument.
I checked with
pyright
and it correctly handles code.The text was updated successfully, but these errors were encountered: