mypy泛型能否表示将返回序列类型作为参数传递?

问题描述 投票:0回答:1

我想编写以下通用Python代码:

from itertools import chain
from typing import Sequence, Hashable, List, Tuple, Type, TypeVar


SequenceT = TypeVar('SequenceT', bound=Sequence)
HashableT = TypeVar('HashableT', bound=Hashable)


def merge_and_sort_into(seq_type, *iterables):
    # type: (Type[SequenceT], *Iterable[HashableT]) -> SequenceT[HashableT]
    return seq_type(sorted(set(chain(*iterables))))


def merge_and_sort_into_list(*iterables):
    # type: (*Iterable[HashableT]) -> List[HashableT]
    return merge_and_sort_into(list, *iterables)


def merge_and_sort_into_tuple(*iterables):
    # type: (*Iterable[HashableT]) -> Tuple[HashableT]
    return merge_and_sort_into(tuple, *iterables)

代码很好,但是mypy不喜欢merge_and_sort_into()的返回类型说error: Type variable "SequenceT" used with arguments。如何将Sequence类型传递给函数,并将该类型用作返回类型? (注意:我没有捕捉到序列的值类型也需要可比/可排序的事实,但我们可以忽略它)。

这里是mypy将接受的版本,但它没有捕获传递到merge_and_sort_into()的类型为其返回类型,因此是强制类型转换的约束。

def merge_and_sort_into(seq_type, *iterables):
    # type: (Callable[[Iterable[HashableT]], Sequence[HashableT]], *Iterable[HashableT]) -> Sequence[HashableT]
    return seq_type(sorted(set(chain(*iterables))))


def merge_and_sort_into_list(*iterables):
    # type: (*Iterable[HashableT]) -> List[HashableT]
    return cast(List[HashableT], merge_and_sort_into(list, *iterables))


def merge_and_sort_into_tuple(*iterables):
    # type: (*Iterable[HashableT]) -> Tuple[HashableT]
    return cast(Tuple[HashableT], merge_and_sort_into(tuple, *iterables))
python mypy python-typing
1个回答
0
投票

Mypy不支持泛型类型变量,因为它们将要求类型系统支持更高种类,如this comment中所述。

© www.soinside.com 2019 - 2024. All rights reserved.