首页 > 解决方案 > 类型检查通用数据类时出现不兼容的类型错误

问题描述

dataclass在 Python 3.9 中针对 a类型检查泛型时Protocol,我收到一个我不理解的错误。

我的例子.py

example.py:21:错误:参数“a”到“Y”具有不兼容的类型“int”;预期“可选[T]”

由于数据类实现的某些方面,mypy 似乎变得困惑。

我的代码是正确的,还是有一个微妙的问题?我能做些什么来帮助 mypy 理解它吗?

此代码在类型检查时产生错误:

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

T = TypeVar("T")


class Xp(Protocol[T]):
    a: Optional[T]


@dataclass
class X(Generic[T]):
    a: Optional[T] = None


@dataclass
class Y(X[int]):
    pass


y: Xp[int] = Y(a=0)

这个没有数据类的等效代码不会产生错误:

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

T = TypeVar("T")


class Xp(Protocol[T]):
    a: Optional[T]


class X(Generic[T]):
    def __init__(self, a: Optional[T] = None) -> None:
        super().__init__()
        self.a = a


class Y(X[int]):
    pass


y: Xp[int] = Y(a=0)

标签: pythongenericsmypypython-dataclasses

解决方案


这个问题之前已经报告给mypy:

https://github.com/python/mypy/issues/10039

有一个解决方法,就是在子类中重新声明属性:

@dataclass
class X(Generic[T]):
    a: Optional[T] = None


@dataclass
class Y(X[int]):
    # Redeclare, instead of just inheriting.
    a: Optional[int] = None

推荐阅读