You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
I get this strange error whereby adding a return annotation causes mypy to fail to identify the code after the "isinstance" block.
Mypy gives an error on the last line of ErrorIfReturnIsAnnotated.foo() while it doesn't give any errors for WorksIfNoReturnAnnotation.foo()
The only difference in those two classes are that one of them declares an explicit None return annotation.
Environment
Mypy version used: 0.950 and 0.960
Mypy command-line flags: None
Mypy configuration options from mypy.ini (and other config files): None
Python version used: Python 3.10.4
Operating system and version: Windows 10 (Version 21H2)
Full simplified test code to reproduce the bug
from abc import ABCMeta
from typing import Generic, TypeVar, Union
class BaseEngine(metaclass=ABCMeta):
pass
class BaseEngineVariantA(BaseEngine):
pass
class BaseEngineVariantB(BaseEngine):
pass
class VariantAConcreteEngine(BaseEngineVariantA):
pass
T = TypeVar('T', bound=Union[BaseEngineVariantA, BaseEngineVariantB])
class IBase(Generic[T], metaclass=ABCMeta):
def __init__(self, engine: T):
self.engine = engine
class IAction(IBase[T], metaclass=ABCMeta):
pass
class ErrorIfReturnIsAnnotated(IBase[T]):
def __init__(self, something: T, actions_injected: type[IAction[T]]) -> None:
self.something = something
self.actions_injected = actions_injected
def foo(self) -> None:
if not isinstance(self.something, VariantAConcreteEngine):
raise Exception("HI")
self.actions_injected(self.something) # Gives a mypy error of - error: Argument 1 to "IAction" has incompatible type "VariantAConcreteEngine"; expected "T"
class WorksIfNoReturnAnnotation(IBase[T]):
def __init__(self, something: T, actions_injected: type[IAction[T]]) -> None:
self.something = something
self.actions_injected = actions_injected
def foo(self):
if not isinstance(self.something, VariantAConcreteEngine):
raise Exception("HI")
self.actions_injected(self.something) # No errors
The text was updated successfully, but these errors were encountered:
Sorry can you explain why that is the case? I assume you're referring to "The function containing the error is not annotated" but the code for IAction has a init in its superclass IBase that dictates the first argument to be "T"
I see thanks, is there a way for me to fix the mypy error for the first class ErrorIfReturnIsAnnotated without having to manually cast "cast(T, self.something)" after the isinstance block then? (That would be an incorrect cast as far as I know)
I would have assumed "actions_injected: type[IAction[T]]" would be happy to take in a concrete version (VariantAConcreteEngine) of one of its bound objects (BaseEngineVariantA) declared in the TypeVar
Uh oh!
There was an error while loading. Please reload this page.
I get this strange error whereby adding a return annotation causes mypy to fail to identify the code after the "isinstance" block.
Mypy gives an error on the last line of ErrorIfReturnIsAnnotated.foo() while it doesn't give any errors for WorksIfNoReturnAnnotation.foo()
The only difference in those two classes are that one of them declares an explicit None return annotation.
Environment
mypy.ini
(and other config files): NoneFull simplified test code to reproduce the bug
The text was updated successfully, but these errors were encountered: