List 是否有协变可变版本?

2023-11-26

我已经将我真正想要注释的代码简化为这个最小版本:

def print_it(numbers_or_nones):
    for i, number in enumerate(numbers_or_nones):
        if number is None:
            numbers_or_nones[i] = 0
            print("NOOOO")
        else:
            print(number)


numbers = [1, 2, 3, 4]
print_it(numbers)

我想对参数进行注释numbers_or_nones of print_it。它需要...

  • ...元素所在的通用类型Optional[int]
  • ...可迭代
  • ...支持索引分配

对于这种情况,正确的类型是什么?请注意,无法更改类型numbers : List[int]。我能看到的唯一选择是使用typing.overload.

List

最简单的事情是List[Optional[int]]。然而,这给出了:

error: Argument 1 to "print_it" has incompatible type "List[int]"; expected "List[Optional[int]]"
note: "List" is invariant -- see http://mypy.readthedocs.io/en/latest/common_issues.html#variance
note: Consider using "Sequence" instead, which is covariant

Sequence

Unsupported target for indexed assignment ("Sequence[Optional[int]]")

可变序列

error: Argument 1 to "print_it" has incompatible type "List[int]"; expected "MutableSequence[Optional[int]]"

简短回答:不存在协变可变集合,此处列出了处理这种情况的可能策略https://mypy.readthedocs.io/en/stable/common_issues.html#invariance-vs-covariance


为什么可变集合不能协变? 因为这会导致严重的问题,例如:

def make_first_None(numbers_or_nones: MutableSequence[Optional[int]]):
    numbers_or_nones[0] = None


numbers: List[int] = [1, 2, 3, 4]
make_first_None(numbers) # Error!! Numbers is not a List[int] anymore!!!

关于为什么可变集合必须不变的更长的解释在这里https://mypy.readthedocs.io/en/stable/generics.html#variance-of-generics


对于这种情况,文档中列出的三种策略如下所示:

  • 使用显式类型注释:
numbers: List[Optional[int]] = [1, 2, 3, 4]
print_it(numbers)
  • 复印并传递
print_it(list(numbers))
  • 使用不可变集合
def print_it(numbers_or_nones: Sequence[Optional[int]]) -> List[int]:
    for number in numbers:
        if number is None:
            print("NOOOO")
        else:
            print(number)
    return [number or 0 for number in numbers]


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

List 是否有协变可变版本? 的相关文章

随机推荐

  • 如何替换标准 DataAnnotations 错误消息

    我正在使用 System ComponontModel DataAnnotations 来验证我的模型对象 如何替换消息标准属性 Required 和 StringLength 生成的而不向每个属性提供 ErrorMessage 属性或对它
  • 如何在 Rails 中的 LOWER("users"."username") 上创建索引(使用 postgres)

    我的系统中发生了顺序扫描UsersController create action SELECT AS one FROM users WHERE LOWER users username LOWER AND users id LIMIT E
  • loadFromRemoteSourcesenabled="true" // XAML 设计器 // VS 11 beta 和 2012 RC

    我经常被这种情况刺痛 当然总是在最糟糕的时刻 当我编辑 xaml 文件时 收到此错误 System NotSupportedException An attempt was made to load an assembly from a n
  • TRY/CATCH 不适用于 SQL Server 代理错误?

    I use sp start job开始工作 工作 test2 只有一步 select getdate waitfor delay 00 00 10 The TRY CATCH code begin try EXEC msdb dbo sp
  • 使用 SQL 视图还是 SQL 查询?

    我正在开发一个从 MS SQL 服务器获取数据的应用程序 2005 在命令文本中 我可以传递这样的 sql 查询 string query SELECT T1 f1 T1 f2 T2 f3 FROM table1 T1 join table
  • 写入字符串时出现分段错误[重复]

    这个问题在这里已经有答案了 我正在尝试编写一个就地反向函数 并且几乎完全遵循在线代码 但运行以下程序会引发总线错误 我是否向reverse 传递了错误类型的参数 void reverse char str char end str char
  • 如何在Android应用程序中播放直播?

    我想申请板球直播 我想知道以下事情 从哪里可以找到播放板球直播的链接 这些是什么类型的链接 有没有播放器可以播放这种类型的视频 目前 我已经实现了网页 但我正在寻找其他替代方案 下面是我的代码 link1 RelativeLayout fi
  • 暂时禁用关闭按钮

    我需要禁用just暂时关闭按钮 应允许最小化和最大化 我尝试过的每个解决方案都会禁用all按钮或只是永久禁用关闭按钮 有没有办法暂时做到 去的方法永久禁用关闭按钮是设置CS NOCLOSE style对于窗体的窗口类 要从 WinForms
  • EF Code First 迁移在 Azure Web 角色上抛出 StackOverflowException

    在 Azure Web 角色 WS 2012 R2 中执行 EF 6 1 2 代码优先迁移时会出现此问题 即使我将连接字符串指向 Azure Sql 数据库 相同的迁移也可以在本地正常运行 StackOverflowException 是由
  • 整数除法与下限商的比较:为什么会出现这个令人惊讶的结果?

    The 今天 Python 的 整数除 运算符让我感到惊讶 gt gt gt math floor 11 1 1 10 0 gt gt gt 11 1 1 9 0 The 文档读作 x 和 y 的 地板 商 那么 为什么 math floo
  • 需要 JavaScript 原型解释

    我通常在我的项目中以这种方式创建我的类 对象文字 var objectName global variables a somevalue func1 function func2 function 如果我必须将其转换为原型格式 我该怎么做
  • SwiftUI 控制台显示 CVDisplayLink 相关消息?

    当我运行我正在开发的基于 MacOS 的 SwiftUI 应用程序时 我在控制台上收到大量输出 例如 2021 12 08 12 40 14 439565 0000 SpDriveApp 6801 159299 0x7fe6e7830820
  • HTML如何在网页中插入动态日期

    我有一个静态网页 没有任何动态变化 然而 客户希望将日期插入到页面内的文本中 该日期将始终是当前日期加上一天 我怎么做 使用 JavaScript 并在加载时插入日期 看一下这里的工作示例 http jsfiddle net xGDvp 这
  • 被 FoldLeft 错误困惑(在 Eclipse 和 REPL 中)

    其背景非常简单 我的假设基于 Odersky 的书 Programming in Scala 2nd Edition 第 8 5 节描述了 占位符语法 我有一个 List List Boolean 即矩形位图 我试图在其中计算值 true
  • 什么是自动覆盖索引?

    使用时EXPLAIN QUERY PLAN在 SQLite 3 中 它有时会给我输出 例如 SEARCH TABLE staff AS s USING AUTOMATIC COVERING INDEX is freelancer AND s
  • 如何将图像和录制文件保存在临时目录中?

    我想将从我的应用程序中拍摄的相机照片和视频录制存储在临时目录中的单独文件夹中一段时间 当任务完成时 他们将保存到数据库中 如何将从相机和视频录制文件中拍摄的图片保存在临时目录中的单独文件夹中 您正在寻找这个来访问缓存文件夹来存储临时文件 N
  • R:ggfortify:“自动绘图不支持 prcomp 类型的对象”

    我正在尝试使用 ggfortify 来可视化我使用 prcomp 所做的 PCA 结果 示例代码 iris pca lt iris c 1 2 3 4 autoplot prcomp iris pca 错误 自动绘图不支持 prcomp 类
  • JPA Hibernate n+1 问题(Lazy 和 Eager Diff)

    我试图理解 n 1 问题 从而找到正确的解决方案 我有两个实体 公司 Entity Table name company public class Company implements Serializable private static
  • 以最小总距离连接所有点的算法

    我有一组点和适用于每对点的距离函数 我想将所有点连接在一起 总距离最小 你知道我可以使用的现有算法吗 每个点都可以链接到几个点 所以这不是通常的 推销员行程 问题 Thanks 你想要的是一个最小生成树 生成一个最常见的两种算法是 Prim
  • List 是否有协变可变版本?

    我已经将我真正想要注释的代码简化为这个最小版本 def print it numbers or nones for i number in enumerate numbers or nones if number is None numbe