python - Mypy 似乎忽略了 TypeVar 类型的界限
问题描述
例如,我有一段代码如下:
from typing import Type, TypeVar, cast
class SuperClass:
pass
T = TypeVar('T', bound=SuperClass)
def cast_to(obj: SuperClass, cast_to: Type[T] = SuperClass) -> T:
return cast(cast_to, obj)
我把它保存在type_check.py
. 如果我在其上运行 mypy,则会收到以下错误消息:
type_check.py:10: error: Incompatible default for argument "cast_to" (default has type "Type[SuperClass]", argument has type "Type[T]")
type_check.py:11: error: Invalid type "cast_to"
根据我对bound
in的理解TypeVar
,只要 aT
是 的子类SuperClass
,应该没问题。但是为什么 mypy 在这里抛出错误呢?谢谢!
解决方案
您的代码有两个问题:首先,您的cast_to
函数的签名应该是:
def cast_to(obj: SuperClass, cast_to: Type[T] = Type[SuperClass]) -> T:
然后,在您的陈述cast
中,我不确定mypy
是否允许您将. 相反,您可以尝试:cast_to
cast
def cast_to(obj: SuperClass, cast_to: Type[T]) -> T:
return cast(T, obj)
当然,使用此定义,您将无法cast_to
仅使用一个参数进行调用。
我现在要问:为什么你觉得你需要这样做?你确定你的设计是好的吗?cast
应该在非常特殊的情况下使用;该文件指出:
强制转换用于消除虚假的类型检查器警告,并在类型检查器无法完全理解发生了什么时为它提供一点帮助。
所以你应该在这里认真质疑你的设计!给我们更多关于你想要达到的目标的信息。也许有比你想做的更好、更干净的设计。
推荐阅读
- encryption - 为什么我不能使用密码作为加密密钥来安全地加密密码?
- r - 克鲁斯卡尔瓦利斯计算
- c# - 如何从json数组字符串中获取键值对
- sparql - 我将如何在 SPARQL 中获取单个 wikidata 实体的坐标(经度和纬度)?
- php - 缩进的 HTML
- python - 重构熊猫数据框
- ios - Swift - 使用 Alamofire 发出多个 GET 请求时出现问题
- c# - DateTime 格式注释不适用于 Visual Studio 中的 Vue 应用程序
- android - 如何从 vb.net 执行 SSH Android cmd 命令
- sql - 优化联合内连接?