首页 > 解决方案 > 多态函数的功能注释

问题描述

假设我有一个多态函数,它重复作为参数传递给它的任何对象(类似于itertools.repeatPython 标准库中的):

def repeat(i):
    while True:
        yield i

如何编写函数注释来说明这是一个多态函数?

让我说清楚,我知道一种可能性是写:

from typing import Any, Iterable


def repeat(i: Any) -> Iterable[Any]:
    while True:
        yield i

然而,这个解决方案是模棱两可的,因为它适用于以下两种情况:

repeat(i: Apples) -> Iterator[Apples]:

或者

repeat(i: Apples) -> Iterator[Oranges]:

我想要一个真正反映函数接受任何类型但它返回一个迭代器的解决方案,该迭代器产生与调用函数相同的类型。

作为 Haskell 的一个例子,这可以使用类型变量来解决,而 Haskell 中的函数类型只是:

repeat :: a -> [a]

其中a是类型变量。我如何在 Python 中得到相同的结果?

标签: pythonannotationspolymorphism

解决方案


Python 文档中有一个非常相似的示例,使用TypeVar

def repeat(x: T, n: int) -> Sequence[T]:
    """Return a list containing n references to x."""
    return [x]*n

在哪里T = TypeVar('T') # Can be anything使用。所以你可以适应这个:

from typing import Iterable, TypeVar

T = TypeVar('T')

def repeat(i: T) -> Iterable[T]:
    while True:
        yield i

推荐阅读