Bug Report
With the example below, the second if doesn't properly narrow the type, it works fine if the Literal['b'] instead of the enum version.
To Reproduce
from queue import Queue
from typing import Literal, TypedDict, Union
from enum import Enum, unique
@unique
class Tag(Enum):
a = 'a'
b = 'b'
class OpA(TypedDict):
tag: Literal[Tag.a]
a: str
class OpB(TypedDict):
tag: Literal[Tag.b]
b: str
Ops = Union[OpA, OpB]
def do(op: Ops):
if op['tag'] == Tag.a:
reveal_type(op)
if op['tag'] == Tag.b:
reveal_type(op)
Expected Behavior
if op['tag'] == Tag.b:
reveal_type(op)
Should report:
t.py:24: note: Revealed type is "TypedDict('t.OpB', {'tag': Literal[t.Tag.b], 'b': builtins.str})"
Actual Behavior
Reported type is:
t.py:24: note: Revealed type is "Union[TypedDict('t.OpA', {'tag': Literal[t.Tag.a], 'a': builtins.str}), TypedDict('t.OpB', {'tag': Literal[t.Tag.b], 'b': builtins.str})]"
Your Environment
- Mypy version(s) used:
mypy 0.910, mypy 0.941, mypy 0.950+dev.fd8a15e1abdd2bb4f75c3a6319ebfba233e1fe8e (compiled: no)
- Mypy command-line flags:
mypy t.py
- Mypy configuration options from
mypy.ini (and other config files): nothing
- Python version used:
Python 3.10.2
- Operating system and version:
Fedora Linux 35
Bug Report
With the example below, the second
ifdoesn't properly narrow the type, it works fine if theLiteral['b']instead of the enum version.To Reproduce
Expected Behavior
Should report:
Actual Behavior
Reported type is:
Your Environment
mypy 0.910,mypy 0.941,mypy 0.950+dev.fd8a15e1abdd2bb4f75c3a6319ebfba233e1fe8e (compiled: no)mypy t.pymypy.ini(and other config files):nothingPython 3.10.2Fedora Linux 35