当前位置: 首页 > 知识库问答 >
问题:

Python类型TypeVar(A,B,covariant=true)是什么意思?

席俊驰
2023-03-14

今天我深入研究了利斯科夫的替代原理和协方差/逆方差。

    null

我对#1的理解

TypeVar('t',A,B)与TypeVar('t',bound=union[A,B])之间的差异

这个答案明确说明T可以是:

    null

MyPy不允许约束的TypeVar是协变的?定义具有约束但协变的键值类型的泛型dict

再次提到bound=union[A,B]大小写,但不理解选项#2的含义,A,B,covariant=true

我试着玩了一下mypy,但似乎弄不明白。有人能指出这是什么意思吗?

  1. A(或A的任何子类型)
  2. B(或B的任何子类型)

(也就是从上面排除了union大小写)

**编辑**

下面的示例代码显示了它们之间的区别。错误来自mypy==0.770

from typing import Union, TypeVar, Generic


class A: pass

class ASub(A): pass

class B: pass


# Case 1... Success: no issues found
# T = TypeVar("T", bound=Union[A, B])

# Case 2... error: Value of type variable "T" of "SomeGeneric" cannot be "ASub"
T = TypeVar("T", A, B, covariant=True)


class SomeGeneric(Generic[T]): pass

class SomeGenericASub(SomeGeneric[ASub]): pass

**编辑2**

最后我在Python/Mypy#8806中询问了这个问题:当T_co=TypeVar(“T_co”,A,B,covariant=true)并传递了A的子类时,泛型[T_co]出错

这消除了我的一些误解。事实证明typeVar(“t”,A,B,covariant=true)并不完全正确,知道值限制AB实际上并不是协变的。

使用covariant=true语法只有在它们相关时才有帮助。

共有1个答案

曹焱
2023-03-14

协方差和反方差是与面向对象和泛型之间的交集相关的术语。

这个概念试图回答的问题是:

  1. 我们有两个“常规”、“面向对象”类,基类派生类
  2. 我们还有一些泛型类型-假设列表
  3. 我们知道Derived可以在base可以的任何地方使用-这是否意味着list 可以在list可以使用的任何地方?
  4. 会不会是相反的呢?也许是相反的方向,现在listcab可以在list 可以使用的地方使用?

边界也来自于OO和泛型的交叉。当我们定义一个泛型类型MyType时-这是否意味着't'可以是任何类型?或者,我可以对T施加一些限制吗?边界允许我声明T的上界是,例如,类derived。在这种情况下,base不能与“myType”一起使用-但derived及其所有子类可以。

协方差和逆方差的定义可以在PEP-484的本节中找到。

 类似资料:
  • 问题内容: ←------为什么还有第二个论点? 问题答案: 字典的方法(例如,这里)有两个参数- 请参阅文档 第二个参数是什么返回如果第一个参数,是不存在的。(如果仅使用一个参数调用,则在没有该键的情况下会引发异常)。 在您的示例中,这是不相关的,因为它 是中 的键。但是,如果您重复该行…: 您会看到它有所不同:第一个删除了键,因此第二个实际上返回了参数(因为现在不存在)。

  • 问题内容: 我尝试了一些代码,使用XOR在Java中交换两个整数而不使用第三个变量。 这是我尝试的两个交换函数: 这段代码产生的输出是这样的: 我很好奇,为什么这样说: 与这个不同吗? 问题答案: 问题是评估的顺序: 参见JLS第15.26.2节 首先,对左操作数求值以产生一个变量。 如果该评估突然完成,则赋值表达式由于相同的原因而突然完成;右边的操作数不会被评估,并且不会发生赋值。 否则,将保存

  • 问题内容: 我正在编写一个拒绝访问未授权用户的安全系统。 它可以按预期授予授权用户访问权限,但也允许未经授权的用户使用! 为什么会发生这种情况?我已经明确指出仅在name等于,或 时才授予访问权限。我也尝试过相反的逻辑if ,但是结果是一样的。 问题答案: 在许多情况下,Python的外观和行为都像自然的英语,但这是这种抽象失败的一种情况。人们可以使用上下文线索来确定和是与动词连接的对象,但是Py

  • 本文向大家介绍看下面代码,判断a和b的类型是否为true?为什么?什么是基本包装类型?相关面试题,主要包含被问及看下面代码,判断a和b的类型是否为true?为什么?什么是基本包装类型?时的应答技巧和注意事项,需要的朋友参考一下 先说结果,输出是false; a是基本数据类型number,b是通过new 操作符创建的引用类型实例,所以typeof(b) 是object,因而结果为false。 基本包

  • 然而,今天我在处理一些代码时,意外地发现以下两个交换给出了不同的结果: 这让我难以置信。有人能给我解释一下这里发生了什么吗?

  • 我尝试了一些代码在Java中交换两个整数,而不使用第三个变量,即使用XOR。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?