I'm trying to ask an isinstance question on a user defined type: ConstData = Union[int, str]:
from typing import Union, Optional
ConstData = Union[int, str]
def foo(x) -> Optional[ConstData]:
if isinstance(x, ConstData): # <--- this doesn't work
# if isinstance(x, (int, str)): <--- this DOES work ...
return x
return None
Sadly enough, it doesn't work:
$ mypy main.py
main.py:4: error: Parameterized generics cannot be used with class or instance checks
main.py:4: error: Argument 2 to "isinstance" has incompatible type "object"; expected "Union[type, Tuple[Union[type, Tuple[Any, ...]], ...]]"
Found 2 errors in 1 file (checked 1 source file)
Is there any elegant way to solve this?
About:
"Still, with if isinstance(x, get_args(ConstData)): return x mypy can't infer that x has the correct return type. It complains it's Any"
I think it is a bug in reveal_type(), Mypy undertands the narrowing of x type. As you can see in the following code, it does not raise an error when test() is called with x:
def test(k:Union[int, str]) -> None:
pass
def foo(x: Any) -> Optional[ConstData]:
if isinstance(x, get_args(ConstData)):
reveal_type(x) # Mypy: Revealed type is "Any"
test(x) # Mypy: no error
return x # Mypy: no error
return None
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With