作为通用类型的一部分的文字 -- python 键入

Literal as part of generic type -- python typing

假设我想在 Python 中设计一个 Array 数据类型。它旨在容纳特定类型的固定大小列表。

T = typing.TypeVar('T')
class Array(typing.Generic[T]):
  l: list[T]
  s: int

所以类型提示应该是这样的:

fixed_size_array: Array[int]

我想做的是在类型提示中包含 Array 的长度,例如:

fixed_size_array_of_five_ints: Array[int, 5]
fixed_size_array_of_four_ints: Array[int, 4]

我可以更改 Array 的实现,因为我唯一的要求是 Array[int, 5] 的类型提示或包含 literal/constant 大小的内容。

这可能吗?

您可以使用文字[...]:

T = typing.TypeVar('T')
S = typing.TypeVar('S')

class Array(typing.Generic[T, S]):
  l: list[T]
  s: S
  def __init__(self, s: S):
    self.l = []
    #...
    self.s = s

def typed_array_op(a: T, b: T) -> T:
  return some_func(a, b)

#...

a2: Array[int, Literal[2]]
b2: Array[int, Literal[2]]
a3: Array[int, Literal[3]]

a2 = array(2)
a3 = array(2) # mypy error

typed_array_op(a2, b2)
typed_array_op(a2, a3) # mypy error