Skip to content

TypeVar error #12882

Closed
Closed
@julzt0244

Description

@julzt0244

Following up on my previous issue, it seems TypeVars are bugged and do not allow for more specific subclasses of one of the bound types specific, unlike using Unions alone?

See the 2 generic types represented by the variables "CombinedTypes" and "T"

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


CombinedTypes = Union[BaseEngineVariantA, BaseEngineVariantB]
T = TypeVar('T', bound=CombinedTypes)


class IBase(Generic[T], metaclass=ABCMeta):
    def __init__(self, engine: T):
        self.engine = engine


class IAction(IBase[T], metaclass=ABCMeta):
    pass


class ErrorIfUsingTypeVar(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 WorksFineUsingUnionsAlone(IBase[CombinedTypes]):
    def __init__(self, something: CombinedTypes, actions_injected: type[IAction[CombinedTypes]]) -> 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)  # No error if using unions alone

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrongtopic-type-narrowingConditional type narrowing / binder

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions