首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >输入TypeVar(A,B,covariant=True)是什么意思?

输入TypeVar(A,B,covariant=True)是什么意思?
EN

Stack Overflow用户
提问于 2020-05-03 01:18:26
回答 1查看 10.9K关注 0票数 32

今天,我深入探讨了Liskov的替代原理和协方差/反方差。

我被困在了以下两个区别上:

  1. T = TypeVar("T", bound=Union[A, B])
  2. T = TypeVar("T", A, B, covariant=True)

我对#1的理解

TypeVar('T',A,B)与TypeVar('T',bound=Union[A,B])的差异

这个答案明确指出,T可以是:

  1. Union[A, B] (或AB的任何子类型(如Union[A, BChild])的联合)
  2. A (或A的任何子类型)
  3. B (或B的任何子类型)

这对我来说很有道理。

My 对#2的理解

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

再次提到bound=Union[A, B]的情况,但没有得到选项2,A, B, covariant=True的意义.

我试着和mypy玩过,但似乎搞不懂。,有人能指出这意味着什么吗?

我认为这意味着:

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

(也就是从上面排除了Union案件)

**编辑**

评论中提出了以下问题:

你确定他们真的不同吗?

下面是示例代码,以显示差异。这些错误来自于mypy==0.770

代码语言:javascript
复制
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**

最后我在( co",A,B,covariant=True)并通过A的子类上问了这个问题

这澄清了我的一些误解。事实证明,TypeVar("T", A, B, covariant=True)并不是真的正确,因为知道AB的值限制实际上并不是协变量的。

covariant=True语法的使用只有在相关时才有帮助。

EN

回答 1

Stack Overflow用户

发布于 2020-05-11 19:38:30

协方差和对方差是与面向对象和泛型的交集相关的术语.

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

  1. 我们有几个“常规”、“面向对象”类,BaseDerived
  2. 我们也有一些通用类型--比方说List<T>
  3. 我们知道Derived可以在任何地方使用--这是否意味着List<Derived>可以在List<Base>可以使用的任何地方使用?
  4. 会不会是另一回事?也许这是相反的方向,现在List<Base>可以在List<Derived>可以使用的任何地方使用?

如果(3)的答案是肯定的,则称为协方差,我们将声明List为有covariance=True。如果(4)的答案为真,则称为contra-variance.如果不为真,则为不变

界也来自OO和泛型的交集。当我们定义泛型类型MyType<T>时,这是否意味着T可以是任何类型?或者,我可以对什么是T施加一些限制吗?边界允许我声明,例如,T的上限是类Derived。在这种情况下,Base不能与MyType一起使用,但是Derived及其所有子类都可以。

协方差和对比方差的定义可在PEP-484的这一节中找到。

票数 46
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61568462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档