Skip to content

(regression: 0.960) Generic[Protocol] fails with dataclass #12876

Closed
@JSS95

Description

@JSS95

Bug Report

The following code uses Generic with Protocol for dataclass. It passes with mypy 0.950, but fails with 0.960.

from dataclasses import dataclass
from typing import Protocol, Dict, TypeVar, Generic


class DataclassProtocol(Protocol):
    __dataclass_fields__: Dict


T = TypeVar("T", bound=DataclassProtocol)


@dataclass
class MyDataclass:
    x: int = 1


class MyGeneric(Generic[T]):
    ...


class MyClass(MyGeneric[MyDataclass]):
    ...

Error messge:

error: Type argument "MyDataclass" of "MyGeneric" must be a subtype of "DataclassProtocol"

Your Environment

  • Mypy version used: 0.960
  • Mypy command-line flags: no flag
  • Mypy configuration options from mypy.ini (and other config files): no config
  • Python version used: 3.10
  • Operating system and version: Ubuntu 20.04

(Edit)

Using typing.ClassVar fixes this.

from dataclasses import Field
from typing import Protocol, ClassVar, Dict

class DataclassProtocol(Protocol):
    __dataclass_fields__: ClassVar[Dict[str, Field]]

Metadata

Metadata

Assignees

No one assigned

    Labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions