多态函数的功能注释
functional annotation of polymorphic functions
说我有一个多态函数,它重复作为参数传递给它的任何对象(类似于 Python 标准库中的 itertools.repeat
):
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 中得到相同的结果?
有一个非常相似的 example in the Python docs 使用 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
说我有一个多态函数,它重复作为参数传递给它的任何对象(类似于 Python 标准库中的 itertools.repeat
):
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 中得到相同的结果?
有一个非常相似的 example in the Python docs 使用 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