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

Python mypy泛型能否表示将返回序列类型作为参数传递?,python,mypy,python-typing,Python,Mypy,Python Typing,我想编写以下通用Python代码: 来自itertools导入链的 输入导入序列、哈希表、列表、元组、类型、类型变量 SequenceT=TypeVar('SequenceT',bound=Sequence) HashableT=TypeVar('HashableT',bound=Hashable) def merge_和sort_为(seq_类型,*iterables): #type:(type[SequenceT],*Iterable[HashableT])->SequenceT[Hasha

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

来自itertools导入链的

输入导入序列、哈希表、列表、元组、类型、类型变量
SequenceT=TypeVar('SequenceT',bound=Sequence)
HashableT=TypeVar('HashableT',bound=Hashable)
def merge_和sort_为(seq_类型,*iterables):
#type:(type[SequenceT],*Iterable[HashableT])->SequenceT[HashableT]
返回序列类型(已排序(集合(链(*iterables)))
def merge_和sort_合并到_列表(*iterables):
#类型:(*Iterable[HashableT])->List[HashableT]
返回merge_和sort_到(列表,*iterables)
def merge_和sort_合并为_元组(*iterables):
#类型:(*Iterable[HashableT])->Tuple[HashableT]
返回merge_和sort_到(tuple,*iterables)
代码很好,但是mypy不喜欢返回类型
merge\u和\u sort\u into()
error:type变量“SequenceT”与参数一起使用。如何将序列类型传递到函数中,并将该类型用作返回类型?(注意:我没有捕捉到序列的值类型也需要是可比较/可排序的这一事实,但是让我们忽略这一点)

这里是mypy将接受的一个版本,但它没有捕获传递到
merge\u和
def merge_和sort_进入(seq_类型,*iterables):
#类型:(可调用[[Iterable[HashableT]],序列[HashableT]],*Iterable[HashableT])->序列[HashableT]
返回序列类型(已排序(集合(链(*iterables)))
def merge_和sort_合并到_列表(*iterables):
#类型:(*Iterable[HashableT])->List[HashableT]
返回强制转换(列表[HashableT],合并和排序到(列表,*iterables))
def merge_和sort_合并为_元组(*iterables):
#类型:(*Iterable[HashableT])->Tuple[HashableT]
返回强制转换(Tuple[HashableT],merge_和sort_为(Tuple,*iterables))

Mypy不支持泛型类型变量,因为它们需要类型系统支持更高的类型,如中所述

即使Mypy支持泛型类型变量,原始函数的类型签名也将是不正确的,因为并非所有的
Sequence
s都可以从iterable中构造。比如说,

class EmptyList(Sequence[T]):
  def __init__(self): pass
  def __getitem__(self, item): raise IndexError
  def __len__(self): return 0

EmptyList([1, 2, 3]) # TypeError
对于您的特定情况,最简单的解决方案可能是只允许非序列返回类型,并使用
Callable
而不是
Type

T, R = TypeVar('T'), TypeVar('R')

def chain_into(into: Callable[[Iterable[T]], R], *iters: Iterable[T]) -> R:
    return into(chain.from_iterable(iters))

谢谢,在我写了这个问题之后,我意识到序列类型没有对它的构造函数提供任何保证。我尝试了可调用的方法,并让它进行了类型检查,但它没有捕捉到返回类型是序列[t]而不仅仅是序列这一事实。它没有帮助,但是Mypy问题和相关问题(特别是)讨论了您正在尝试做什么以及为什么它不起作用。