MyPy 不允许受约束的 TypeVar 是协变的?使用受约束但协变的键值类型定义通用字典

2024-04-14

我正在尝试定义一个自定义通用字典,其键的类型T_key并且值的类型T_val.
我也想限制一下T_key and T_val,使得T_key只能是类型A or B或其子类。

我该如何实现这个目标?

from typing import TypeVar, Generic

class A: ...
class B: ...

class Asub(A): ...
class Bsub(B): ...

T_key = TypeVar('T_key', A, B, covariant=True)
T_val = TypeVar('T_val', A, B, covariant=True)


class MyDict(Generic[T_key, T_val]): ...


w: MyDict[   A,    B]
x: MyDict[   A, Bsub]
y: MyDict[Asub,    B]
z: MyDict[Asub, Bsub]

当我尝试检查这一点时,mypy 在注释上给出了错误x, y and z。仅注释为w按预期工作。

generic.py:17: error: Value of type variable "T_val" of "MyDict" cannot be "Bsub"
generic.py:18: error: Value of type variable "T_key" of "MyDict" cannot be "Asub"
generic.py:19: error: Value of type variable "T_key" of "MyDict" cannot be "Asub"
generic.py:19: error: Value of type variable "T_val" of "MyDict" cannot be "Bsub"

我不明白为什么Asub不是有效类型T_key即使covariant=True指定的。

我在这里缺少什么?

mypy 版本:0.630


这不是协方差的意思。使用协变类型变量T和一个泛型类Foo[T],实例Foo[Subclass]也被视为实例Foo[Superclass]。协方差对于可以替代的类型没有影响T.

If your B被定义为

class B(A): ...

代替

class B: ...

,然后是一个类型的值MyDict[B, B]将被视为类型的有效值MyDict[A, A]由于协方差,由静态类型检查器执行。您仍然无法创建类型的值MyDict[ASub, BSub],因为类型变量的唯一有效值是A and B.

您正在寻找的概念是bounded类型变量,使用bound关键字参数,而不是约束类型变量。看起来您可以指定一个联合作为边界,这让我感到非常惊讶,因此将类型变量声明为

T_key = TypeVar('T_key', bound=Union[A, B])
T_val = TypeVar('T_val', bound=Union[A, B])

应该管用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MyPy 不允许受约束的 TypeVar 是协变的?使用受约束但协变的键值类型定义通用字典 的相关文章

随机推荐

  • 轴位于中心的 R 图

    默认情况下 R 中的笛卡尔轴位于图的底部和左侧 如何使轴居中 如下图所示 Example using data generated by bgoldst estimate curve x lt seq 1 1 5 0 1 y lt c 1
  • 使用 Hibernate 映射双向列表

    我不明白映射双向列表时 Hibernate 的行为 Hibernate 生成的 SQL 语句对我来说似乎不是最佳的 有人可以启发我吗 场景如下 我有一对多的父子关系 我用双向列表来映射这种关系 根据Hibernate 注解参考指南 http
  • AngularJS:如何在模板内设置变量?

    我怎样才能避免 f 第三行语句打印出内容forecast day iso 我想避免使用forecast day iso temperature每次迭代依此类推 div index day iso day name f forecast da
  • IE9 文本渲染问题 - 字母尾部被切断

    我遇到了一个问题 在 IE9 标准模式下 IE9 以降序字母的尾部 q p y 等 消失的方式呈现文本 已尝试使用填充和其他常见的 CSS 设置来帮助解决此问题 但到目前为止我还没有运气 谁知道这可能是什么 EDIT 我在博客上找到了这个
  • Glassfish 3.1.1:在 RESTful Web 服务中检索 HTTP 身份验证

    我正在使用基于我的客户表的 HTTP 身份验证 用户通过身份验证后 将调用静态 Web 服务 但是我如何在 Web 服务中访问 HTTP 身份验证 HttpRequest 的标头数据 我的代码如下所示 GET Path id Produce
  • 战舰人工智能在一定规则下沉没部分[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我在寻找在某些规则下是否可以为战舰沉
  • 使用 msbuild 扩展包验证文件夹是否存在?

    如何使用 msbuild 扩展包任务可靠地验证文件夹是否存在 我怎样才能做到这一点而不引发错误并停止构建 您可以在目标上使用 Exists 条件吗 仅当与 msbuild 文件位于同一目录中存在名为 Testing 的目录或文件时 才会执行
  • 如何循环访问类的属性?

    C 有没有办法循环遍历类的属性 基本上我有一个包含大量属性的类 它基本上保存大型数据库查询的结果 我需要将这些结果输出为 CSV 文件 因此需要将每个值附加到一个字符串中 最明显的方法是将每个值手动附加到字符串中 但是有没有一种方法可以有效
  • 如何对一组和进行求和? SQL Server 2008

    我有一个查询sum像这样 SELECT Table1 ID SUM Table2 Number1 Table2 Number2 AS SumColumn FROM Table1 INNER JOIN Table3 ON Table1 ID
  • 如何在 Spring Hibernate 运行时设置数据库名称

    问题描述 Spring中有一个类叫做AbstractRoutingDataSource这将适合您的要求 浏览文档 您将找到一些有关如何实现具体类的帮助 您需要更改 或添加 现有代码的某些部分才能配置动态Data source 这个博客 ht
  • 在数据库中实施审查标志;最佳实践

    我需要存储一些与某些实体相关的评论标志 每个审核标志只能与单个实体属性组相关 例如表Parents has a ParentsStatus旗帜和桌子Children有一组ChildrenStatus flags 在当前的设计方案中 我有三个
  • 保留大小相等的分割视图

    我在非最大化窗口模式下启动 GVIM 并水平分割其窗口 确保窗口大小相等 当我最大化主 GVIM 窗口时 如何保留这个大小相等的分割视图 每当我最大化 GVIM 时 都会忘记窗口已被平均分割 Thanks 均衡分割的命令是 W ctrl W
  • 使自定义图像尊重tintColor属性iOS

    我必须想象这个问题已经被问过好几次了 但我的问题措辞一定不正确 我有自己在 Photoshop 中制作的自定义图像 并将其设置为按钮的图像属性 这里正常显示 背景是透明的 但它是 44x44 其中三个点是 88x88 像素的 png 文件
  • 使用 CSS 时链接不起作用

    我遇到了一个无法通过谷歌搜索解决的问题 我有一个静态 HTML
  • 一个关于二分查找的问题

    为什么人们通常使用二分搜索而不是三重搜索 将 每次分成三份 或者甚至每次分成十份 因为二分查找会产生最少数量的比较和查找 为了简单直观 请考虑每次分为 4 部分 v1 v2 v3 您现在已经完成了 3 次查找 并且必须将您正在搜索的最坏值与
  • 使用实体框架代码优先的 FSharp 记录类型

    我正在一个业务应用程序中进行概念验证 我想用 F 替换当前的 C 代码优先实体框架实现 我正在关注this http blogs msdn com b visualstudio archive 2011 04 04 f code first
  • 干净的架构,用例依赖关系

    最近 我找到了方法干净的架构 https 8thlight com blog uncle bob 2012 08 13 the clean architecture html鲍勃叔叔的帖子 但是 当我尝试将其应用到当前项目时 当一个用例需要
  • 更改 SQL Server 2012 数据库的排序规则

    更改排序规则 我需要更改特定服务器上的一个数据库的排序规则Latin1 General CI AS to SQL Latin1 General CP1 CI AI以便它与我们数据库的其余部分相匹配 问题 但是 当我尝试执行此操作时 出现以下
  • 以最小的质量损失调整大小

    我需要调整图像大小 但图像质量不会受此影响 图像将从 10x10 到 1000x1000 它会有一些严重的拥塞和一些空白时间 它必须同时放大和缩小 可能会损失一些图像质量 可以 但必须至少是 所有东西都确实带有光栅图形 请不要使用库或其他外
  • MyPy 不允许受约束的 TypeVar 是协变的?使用受约束但协变的键值类型定义通用字典

    我正在尝试定义一个自定义通用字典 其键的类型T key并且值的类型T val 我也想限制一下T key and T val 使得T key只能是类型A or B或其子类 我该如何实现这个目标 from typing import TypeV