[英]How can I define a TypeAlias for a nested Generic in Python?
我目前有这段代码
T = TypeVar("T")
Grid = Sequence[Sequence[T]]
def columns(grid: Grid) -> Iterable[list[T]]:
return ([row[i] for row in grid] for i in range(len(grid[0])))
但我认为别名Grid
中的T
绑定到 function 的返回类型中的不同T
如何定义Grid
以便我可以编写
def columns(grid: Grid[T]) -> Iterable[list[T]]:
...
我看过typing.GenericAlias
,但看不到它对我有何帮助。
(我知道 Sequence[Sequence[T]] 不能保证网格实际上是矩形的,但这不是我想在这里关注的问题。)
当使用类型变量作为泛型参数时,可以用其他类型变量代替,在Generic Alias Type中有提到(不过我只找到了这一个):
通用容器的
__getitem__()
方法将引发异常以禁止类似dict[str][str]
的错误:>>> dict[str][str] Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: There are no type variables left in dict[str]
但是,当使用类型变量时,这样的表达式是有效的。 索引必须具有与
GenericAlias
对象的__args__
中的类型变量项一样多的元素。>>> from typing import TypeVar >>> Y = TypeVar('Y') >>> dict[str, Y][int] dict[str, int]
所以你目前的实现没有问题。 在交互式解释器中,您将看到:
>>> from collections.abc import Sequence
>>> from typing import TypeVar
>>> T, R = TypeVar('T'), TypeVar('R')
>>> Grid = Sequence[Sequence[T]]
>>> Grid
collections.abc.Sequence[collections.abc.Sequence[~T]]
>>> Grid[R]
collections.abc.Sequence[collections.abc.Sequence[~R]]
Mypy 也会正确地分析它们:
from collections.abc import Sequence, Iterable
from typing import TypeVar
T = TypeVar('T')
Grid = Sequence[Sequence[T]]
def columns(grid: Grid[T]) -> Iterable[list[T]]:
return ([row[i] for row in grid] for i in range(len(grid[0])))
c1: Iterable[list[int]] = columns([[1, 2, 3]]) # pass
c2: Iterable[list[int]] = columns([[4, 5, '6']])
# List item 2 has incompatible type "str"; expected "int" (13:42)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.