Skip to content

issubclass(...) causes a TypeVar to become a Union, leading to false positives #11163

Closed
@finite-state-machine

Description

@finite-state-machine

Bug Report

The presence of issubclass(...) in the code sample that follows causes arg to take on type Union[T, Type[object]]. This change in type leads to false positives, as demonstrated below.

To Reproduce

Run mypy on the following code: mypy-play.net

from typing import TypeVar

T = TypeVar('T')

def function(arg: T) -> T:
    if isinstance(arg, type) and issubclass(arg, Exception):
        raise RuntimeError
    return arg  # error: Incompatible return value type (got "Union[T, Type[object]]", expected "T")  [return-value]

Expected Behavior

No errors should be reported. Testing the type of a variable should not change the type of the variable as seen outside the controlled code blocks (if/else).

Actual Behavior

The type of arg is changed, leading to a false positive as noted in the code sample above.

Your Environment

  • Mypy version used: 0.910 [edit: verified with 1.9.0]
  • Mypy command-line flags: (none necessary)
  • Mypy configuration options from mypy.ini (and other config files): (none)
  • Python version used: 3.8.3 from pyenv [edit: verified with 3.10]
  • Operating system and version: macOS 10.14 with homebrew

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions