【发布时间】:2022-10-14 12:22:01
【问题描述】:
我发现它能够以这种方式或通过 throw __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
如何正确子类化元组?谢谢你的建议。
【问题讨论】:
-
@j1-lee 一样。顺便说一句,我建议@Micah 使用
Tuple[int, ...]或Tuple[int, int, int]而不是tuple[int, int, int]byfrom typing import Tuple。 -
Python 3.10.5,使用 Tuple 得到相同的 mypy 错误
-
诡异的。我在 3.10.6 中没有错误。见codepaste.xyz/posts/yNMuXCiujJqobjQgMZcL
-
@hide1nbush
b: Tuple[int, ...] = a((1, 2, 3))与b: tuple[int, int, int] = a((1, 2, 3))不一样 -
关于在子类上保留类型参数的能力(如
a[int,int,str]),即可变参数泛型,请参阅discussion in comments to this question。建议的答案在这里不起作用(因为您需要一个子类而不是别名),但 PEP646 讨论了您的(唯一?)方法,仍然缺乏mypy支持。
标签: python generics subclass mypy typing