-
-
Notifications
You must be signed in to change notification settings - Fork 3.1k
Open
Labels
bugmypy got something wrongmypy got something wrongtopic-type-narrowingConditional type narrowing / binderConditional type narrowing / bindertopic-typeguard-typeisTypeGuard / TypeIs / PEP 647 / PEP 742TypeGuard / TypeIs / PEP 647 / PEP 742
Description
Bug Report
When I use a TypeIs on a union of a TypeVar and something else (for example int), it seems the negative type narrowing does not work. mypy accepts it as safe in version 1.17.1, but fails since 1.18.1.
In my stack overflow question about this, a commenter said this was changed in #18193 and they suspect it to be a bug. I don't know if it is a bug, however the code below sure looks safe to me.
To Reproduce
Check the following code with mypy, at least version 1.18.1
mypy playground
from typing import TypeVar, Callable, Any
from typing_extensions import TypeIs
_T = TypeVar('_T')
def foo(x: _T | int, checker: Callable[[Any], TypeIs[_T]], default: int) -> int:
if checker(x):
return default
else:
return xExpected Behavior
Succeeds
Actual Behavior
Fails
main.py:12: error: Incompatible return value type (got "_T | int", expected "int") [return-value]
Found 1 error in 1 file (checked 1 source file)
-> Error is raised on the return line in the else branch
Your Environment
- Mypy version used: 1.18.1
- Mypy command-line flags: none
- Mypy configuration options from
mypy.ini(and other config files): unchanged - Python version used: 1.12
Metadata
Metadata
Assignees
Labels
bugmypy got something wrongmypy got something wrongtopic-type-narrowingConditional type narrowing / binderConditional type narrowing / bindertopic-typeguard-typeisTypeGuard / TypeIs / PEP 647 / PEP 742TypeGuard / TypeIs / PEP 647 / PEP 742