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

python子类列表和匹配的泛型

巴英韶
2023-03-14

我发现它能够以这种方式或通过抛出__new__进行子类化,没有问题,但类型检查。

class a(tuple):
    pass

print(a((1, 2, 3)))  # <---- ( 1, 2, 3 )

b: tuple[int, int, int] = a((1, 2, 3))  # <--- Error
# Incompatible types in assignment (expression has type "a", variable has type "Tuple[int, int, int]")

c: tuple = a((1, 2, 3))  # <--- Ok  

d: tuple[int, int, int] = (1, 2, 3)  # <--- Ok  

当您的子类列表工作时,方式相同。

    class a( list[ T ] ) 
 
        def __init__(self, * pax : T  )  : pass

    b : list[ int ] = a( 1, 2 ) # <--- Ok  

    c = a[ int ]( 1, 2 ) # <--- Ok  

如何才能正确子类化tuple?谢谢你的建议。

共有1个答案

狄赞
2023-03-14

您感到困惑的问题与子类无关,而是由于mypy如何假设任何序列通过其名称(例如元组(((项目,项目,...,项目))作为参数传递给任何元组及其子类,而不是Python元组语法(项目,项目,...,项目,))而具有签名元组[Any, ...](因为这是默认元组构造函数的类型签名)。请考虑下面的代码示例:

one_tuple: tuple[int] = tuple((1,))
answer: tuple[int] = (1,)
print(one_tuple == answer)

使用python运行上述代码将产生输出True,这是预期的。但是,mypy会产生以下错误消息:

onetuple.py:1: error: Incompatible types in assignment (expression has type "Tuple[int, ...]", variable has type "Tuple[int]")
Found 1 error in 1 file (checked 1 source file)

鉴于不可能使用Python的标准元组语法来产生其子类的实例(因为它总是产生< code >元组 ),任何< code >元组的子类(例如< code >类MyTuple(tuple):...)将因此不能满足任何< code >元组[T],其中< code>T不是可变长度的序列。

虽然问题中没有说明以下断言,但如果您确定元子类将具有一些有限的长度,这可能是一个合适的解决方法:

class MyTuple(tuple[int, int, int]):
    pass

mytuple: tuple[int, int, int] = MyTuple((1, 2, 3))

在这种情况下,mypy不会生成任何验证错误。

作为补充,随着PEP 646 -可变泛型的引入,从Python 3.11开始,这可能成为可能,但是< code>mypy还不支持这一点(参见GitHub问题python/mypy#12840,在新的类型特性下,PEP 646 -截至2022-10-14还没有跟踪到子问题),并且< code>pyright和< code>pyre似乎不能正确检查语句< code

 类似资料:
  • 问题内容: 我有一个关于将子类列表分配给超类列表的基本问题。 所以我有以下内容: 为什么最后一次分配失败?对不起,新手问题 问题答案: 为了解释这一点,让我用整数代替“ B”,用数字代替“ A”。这只是为了使其更容易解释。 失败的原因是因为nList可以采用任何Number;可以采用Integer;可以采用Double;或者就此而言,可以是Number的任何子类。但是,对于iList并非如此。您不

  • 我试图遍历一个字典,其中每个键都包含一个列表,该列表依次包含0到20个子列表。目标是迭代字典1的值,检查它们是否在字典2的任何子列表中用于相同的密钥,如果是,则将1添加到计数器中,而不再次考虑子列表。 代码看起来有点像这样: 这显然不起作用,主要是因为代码无法通过列表和子列表进行分层检查,部分原因是可能不正确的迭代语法。我对嵌套循环和迭代没有最大的把握,这使得这很痛苦。另一种选择是首先使用以下方法

  • 问题内容: Mockito提供: 如何避免警告,如果需要呢? 问题答案: 对于Java 8及更高版本,很简单: 对于Java 7及更低版本,编译器需要一些帮助。用途:

  • 我正在修改open JDK以添加特性,我已经遇到了两次,但没有好的解决方案。

  • 可以使用泛型将返回类型与参数类型匹配吗? 实例案例: 我有一个抽象类,可以从不同的POJO导入数据,这个类包含一个abstract方法importData。 importData返回的对象必须与传递给该方法的对象类型相同。 由于抽象方法的每个实现的对象类型不同,并且类型不扩展另一个,如何定义抽象方法,以便实现返回类型和传递类型必须匹配? 经过考验: 结果: 方法的返回类型不必与传递的对象类型匹配。