python - 类型检查通用数据类时出现不兼容的类型错误
问题描述
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)
解决方案
这个问题之前已经报告给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
推荐阅读
- node.js - 如何使用nodejs在mongodb中为具有唯一和多个电话号码的人创建模式
- mule - 如何循环或迭代数组列表,然后连接 Dataweave 中的值
- reactjs - 如何仅在我的 PC 中本地部署 React 应用程序?
- reactjs - Webpack 配置 - DLL 的优化
- python - Python Regex 查找混入随机空格的单词
- java - Gradle 可以在没有 main() 的情况下执行 TornadoFX 应用程序,而 IntelliJ 不能......为什么?
- javascript - 如何在没有“... 19 more ...”截断的情况下使用 vs-code 提取大型类型?
- c++ - 如何在windows中运行编译好的项目
- sql - 如何批量更新所有表的序列 ID postgreSQL
- swift - 尝试从 FTPS 下载文件时 SSL 握手失败