python - 了解 TypeVar 的用法
问题描述
在谈到 时Generics
,python 给出了以下示例:
from collections.abc import Sequence
from typing import TypeVar
T = TypeVar('T') # Declare type variable
def first(l: Sequence[T]) -> T: # Generic function
return l[0]
有人可以解释一下TypeVar
在这种情况下做什么吗?例如,如果它可以是任何东西,为什么不给它 valueAny
呢?如果它受到约束,为什么不给它一个Union
值呢?换句话说, using 有什么用处TypeVar(...)
?
我想在回顾上述内容时,它在某种子元素的元素时使用?例如,它可能是:
[{set1}, {set2}, {set3}, ...]
这种类型将是Sequence[set] -> set
但是这样的事情:
[1, 2, 3, ...]
会有类型Sequence[int] -> int
。除了这个“item-in-iterable”之外还有其他用法吗?
解决方案
在此上下文中的目的TypeVar
是说函数返回与参数类型相关的特定类型。
例如,如果您这样做:
a = first([1, 2, 3]) + "foo"
你会得到一个错误,因为在这个表达式中T
会绑定到 type int
,所以你会得到一个关于添加 anint
和 a的错误str
。
如果您使用描述first
的Any
类型进行注释,则不会产生 mypy 错误(因此您会TypeError
在运行时得到 a ),因为返回值first
总是简单的Any
.
有关如何使用 typevars 的更多示例,请参阅有关泛型的 mypy 文档:https ://mypy.readthedocs.io/en/stable/generics.html
推荐阅读
- python - Python 命名空间包
- javascript - 如何对阿拉伯文本进行编程;计算每个字母的数量,例如
- java - Hibernate saveOrUpdate-method 创建新的条目/行而不是更新现有的
- ruby-on-rails - 将数据从单选按钮发送到控制器以验证 Rails 中的嵌套属性值
- api - 在 API 或微服务文件系统上存储文件
- java - Cordova 没有构建 apk
- php - 在发表评论之前,如何使 Wordpress 评论复选框成为强制性/必需的?
- javascript - 如何将一个技巧的长标签分成多行?
- azure-web-app-service - 在 Azure Web 应用程序中上传的用户权限
- node.js - 我可以只使用redis和node吗?