-
-
Notifications
You must be signed in to change notification settings - Fork 3k
Open
Labels
Description
Preamble
- This issue may already exists but I was unable to find an exact match. There are plenty of issues related to the PEP 604 syntax but none that are really about using
typing.Union
/typing.Optional
/... - Support for PEP 604 syntax was recently added in
isinstance
doesn't work on type aliases that use a union #11673 / Fix isinstance with type aliases to PEP 604 unions #17371 - Old style unions were briefly mentioned in Fix isinstance with type aliases to PEP 604 unions #17371 (review)
Feature
Example code
from typing import Any, Union, Optional
foo: Any = None
if isinstance(foo, int | None):
reveal_type(foo)
if isinstance(foo, Union[int, None]):
reveal_type(foo)
if isinstance(foo, Optional[int]):
reveal_type(foo)
bar = int | None
baz = Optional[int]
if isinstance(foo, bar):
reveal_type(foo)
if isinstance(foo, baz):
reveal_type(foo)
Output for the above with mypy v1.11.1:
src/union.py:6: note: Revealed type is "Union[builtins.int, None]"
src/union.py:8: error: Argument 2 to "isinstance" has incompatible type "<typing special form>"; expected "_ClassInfo" [arg-type]
src/union.py:9: note: Revealed type is "Any"
src/union.py:11: error: Argument 2 to "isinstance" has incompatible type "<typing special form>"; expected "_ClassInfo" [arg-type]
src/union.py:12: note: Revealed type is "Any"
src/union.py:17: note: Revealed type is "Union[builtins.int, None]"
src/union.py:19: error: Parameterized generics cannot be used with class or instance checks [misc]
src/union.py:19: error: Argument 2 to "isinstance" has incompatible type "<typing special form>"; expected "_ClassInfo" [arg-type]
src/union.py:20: note: Revealed type is "Any"
Found 4 errors in 1 file (checked 1 source file)
Running the above with pyright:
.../src/union.py
.../src/union.py:6:17 - information: Type of "foo" is "int | None"
.../src/union.py:9:17 - information: Type of "foo" is "int | None"
.../src/union.py:12:17 - information: Type of "foo" is "int | None"
.../src/union.py:17:17 - information: Type of "foo" is "int | None"
.../src/union.py:20:17 - information: Type of "foo" is "int | None"
0 errors, 0 warnings, 5 informations
Summary:
- when using the PEP 604-syntax the type is correctly narrowed to
Union[builtins.int, None]
- when using the
typing.Union
and/ortyping.Optional
syntax the type is not narrowed and remainsAny
(and errors are shown)
danielward27