gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 14:20:33 26 4
gpt4 key购买 nike

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

而且我陷入了两者之间的差异:

  • T = TypeVar("T", bound=Union[A, B])
  • T = TypeVar("T", A, B, covariant=True)


  • 我对#1的理解

    Difference between TypeVar('T', A, B) and TypeVar('T', bound=Union[A, B])

    This answer明确指出 T可以是:

    1. Union[A, B] (or a union of any subtypes of A and B such as Union[A, BChild])
    2. A (or any subtype of A)
    3. B (or any subtype of B)


    这对我来说很有意义。

    我对#2的理解不正确

    MyPy doesn't allow constrained TypeVar's to be covariant? Defining a generic dict with constrained but covariant key-val types

    重新提到了 bound=Union[A, B]的情况,但没有得到选项#2 A, B, covariant=True的含义。

    我尝试过使用 mypy,似乎无法弄清楚。
    谁能指出这是什么意思?

    我认为这意味着:
  • A(或A的任何子类型)
  • B(或B的任何子类型)

  • (aka也从上面排除了 Union的情况)

    **编辑**

    在评论中有人问:

    Are you sure that they're actually different?



    这里是示例代码,以显示差异。错误来自 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: Generic[T_co] erroring when T_co = TypeVar("T_co", A, B, covariant=True) and passed subclass of A中问了这个

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

    仅当 covariant=True语法相关时,它们才有用。

    最佳答案

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

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

  • 我们有几个“常规”,“面向对象”类,BaseDerived
  • 我们也有一些通用类型-假设List<T>
  • 我们知道Derived可以在任何baset可以使用的地方使用-这是否意味着List<Derived>可以在List<Base>可以使用的任何地方使用?
  • 可能是相反的方式吗?也许是相反的方向,现在List<Base>可以在任何地方使用List<Derived> cab吗?

  • 如果对(3)的回答为是,则称为协方差,我们将声明 List为具有 covariance=True。如果对(4)的回答为真,则称为“逆方差”。如果没有一个是真的,则它是不变的。

    界限也来自面向对象和泛型的交集。当我们定义通用类型MyType时–是否意味着'T'可以是任何类型?或者,我可以对T可能施加一些限制吗?界限让我指出T的上限是例如 Derived类。在这种情况下, Base不能与“MyType”一起使用-但 Derived及其所有子类都可以使用。

    协方差和协方差的定义可以在 this section of PEP-484中找到。

    关于Python键入TypeVar(A,B,covariant = True)是什么意思?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61568462/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com