python - 多态函数的功能注释
问题描述
假设我有一个多态函数,它重复作为参数传递给它的任何对象(类似于itertools.repeat
Python 标准库中的):
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 中得到相同的结果?
解决方案
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
推荐阅读
- python - 在终端中显示正在运行的 Python 代码
- json - 在 Spring RestTemplate 响应中将 JSON 属性映射到 Java Map
- python - sklearns TfidfVectorizer的`idf_`是什么?
- websphere - 服务器死机后如何重新安装部署管理器
- python - 对于文件 json 中的键和值
- java - 慢 HikariDataSource.getConnection() 在低流量时慢,在大流量时快
- r - 如何编写一个 r 块来加载 tidyverse?
- pyspark - 将数据框写入CSV文件时如何避免生成crc文件和SUCCESS文件?
- css - 使用 SVG feTurbulence 作为过滤器会导致 Safari 出现奇怪的渲染问题
- javascript - 有谁知道如何使观看状态与 url 一起工作?