Skip to content

issubclass() fails to narrow dataclasses in comprehensions #21635

Description

@ygale

Bug Report

When iterating over a list[type[A]] in a comprehension with if issubclass(cls, M) where A and M are dataclasses, mypy is unable to narrow the type of cls to type[M].

To Reproduce

from dataclasses import dataclass

@dataclass
class A:
  pass

@dataclass
class M:
  pass

@dataclass
class B(A):
  pass

@dataclass
class C(M, A):
  pass

alist: list[type[A]] = [B, C]
mlist: list[type[M]] = [cls for cls in alist
  if issubclass(cls, M)]

Expected Behavior

Typechecks.

Actual Behavior

error: List comprehension has incompatible type List[type[A]]; expected List[type[M]] [misc]
Found 1 error in 1 file (checked 1 source file)

Notes

This error DOES NOT occur if the classes are not dataclasses.

This error DOES NOT occur in a regular for loop:

mlist: list[type[M]] = []
cls: type[A]
for cls in alist:
  if issubclass(cls, M):
    mlist.append(cls)

This error DOES still occur if issubclass() is wrapped in a TypeIs guard function:

def is_m(t: type) -> TypeIs[type[M]]:
  return issubclass(t, M)

alist: list[type[A]] = [B, C]
mlist: list[type[M]] = [cls for cls in alist
  if is_m(cls)]

Your Environment

  • Mypy version used: mypy 2.1.0 (compiled: no)
  • Mypy command-line flags: none
  • Mypy configuration options from mypy.ini (and other config files): nothing special
  • Python version used: 3.13.13

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugmypy got something wrong
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions