Open
Description
Repro:
bug.py:
from __future__ import annotations
from typing import *
class B:
pass
class A:
name: Optional[Union[str, B]]
def foo(a: A):
if isinstance(a.name, str):
pass
elif isinstance(a.name, B):
pass
else:
raise AssertionError
bar(a.name)
def bar(arg: Union[str, B]):
pass
mypy incorrectly reports an error:
bug.py:22: error: Argument 1 to "bar" has incompatible type "object"; expected "Union[str, B]"
Interestingly, when a.name
is aliased with another name, the issue disappers, i.e. the following is checked without an issue:
ok.py:
from __future__ import annotations
from typing import *
class B:
pass
class A:
name: Optional[Union[str, B]]
def foo(a: A):
a_name = a.name
if isinstance(a_name, str):
pass
elif isinstance(a_name, B):
pass
else:
raise AssertionError
bar(a_name)
def bar(arg: Union[str, B]):
pass
Metadata
Metadata
Assignees
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
ilevkivskyi commentedon Nov 6, 2019
I confirm this. This honestly looks like a mystery, it looks like mypy applies a join instead of a union for attribute expressions, but understanding why would require some investigation.
A | B | None
becomesobject
after narrowing checks #12009