今天我深入研究了利斯科夫的替代原理和协方差/逆方差。
我对#1的理解
TypeVar('t',A,B)与TypeVar('t',bound=union[A,B])之间的差异
这个答案明确说明T
可以是:
MyPy不允许约束的TypeVar是协变的?定义具有约束但协变的键值类型的泛型dict
再次提到bound=union[A,B]
大小写,但不理解选项#2的含义,A,B,covariant=true
。
我试着玩了一下mypy
,但似乎弄不明白。有人能指出这是什么意思吗?
A
(或A
的任何子类型)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)
并不完全正确,知道值限制A
和B
实际上并不是协变的。
使用covariant=true
语法只有在它们相关时才有帮助。
协方差和反方差是与面向对象和泛型之间的交集相关的术语。
这个概念试图回答的问题是:
基类
和派生类
。列表
。list
可以在list
可以使用的任何地方?list
cab可以在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。 以下是我尝试的两个交换函数: 该代码产生的输出如下: 我很想知道,为什么会有这样的说法: 和这个不一样?