繁体   English   中英

如何为 Python 中的嵌套泛型定义 TypeAlias?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM