【问题标题】:Incompatible type error when type checking generic dataclasses类型检查通用数据类时出现不兼容的类型错误
【发布时间】:2021-12-18 05:10:27
【问题描述】:

在 Python 3.9 中对通用 dataclassProtocol 进行类型检查时,我收到一个我不理解的错误。

mypy 示例.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)

【问题讨论】:

    标签: python generics mypy python-dataclasses


    【解决方案1】:

    此问题之前已报告给 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多