当前位置: 首页 > news >正文

什么是协变(Covariant)与逆变(Contravariant)?

 代码来源: longchain_core/runnables/utils.py Line 38

from typing import TypeVar
"""
"""
Input = TypeVar("Input", contravariant=True)

0 解释

类型含义
协变(Covariant)如果 Dog 是 Animal 的子类,那么 List[Dog] 也可以当作 List[Animal] 使用。
逆变(Contravariant)如果 Dog 是 Animal 的子类,那么 SomeClass[Animal] 可以当作 SomeClass[Dog] 使用。

1 举个例子:

class Animal:passclass Dog(Animal):passdef feed(animal: Animal):print("Feeding an animal")# 假设我们有一个接受 Dog 的函数
def take_dog(handler: SomeClass[Dog]):pass

如果你有一个 SomeClass[Animal] 实例,由于它是 SomeClass[Dog] 的超类(因为 Input 是逆变),你可以把它传给需要 SomeClass[Dog] 的地方。

2 为什么设置 contravariant=True? 

当你希望某个泛型类或协议接受的输入类型是可以“向上兼容”的时候,就使用逆变。
常见于:

  • 函数参数
  • 输入流(如请求数据)
  • 配置对象

例如,在 LangChain 中,某些 Runnable(可执行对象)接收输入数据,这些数据可能是不同类型,但只要符合输入要求即可。

3 小结

概念说明
TypeVar("Input")定义一个泛型类型变量,表示“任意类型”
contravariant=True设置该类型变量为逆变,意味着可以用父类型的实例替代子类型
应用场景函数参数、输入处理等需要“宽泛匹配”的情况

这样设计可以让类型系统更灵活,也更贴近实际使用场景。 

4 创建通用类型参数 TypeVar 一些其他的代码示例

# TypeVar 类型变量
# 创建通用类型参数
# 场景: 泛型函数/类的类型参数化:比如创建一个函数,无论是处理整数\字符串还是自定义对象
from typing import TypeVar,SequenceT = TypeVar('T')  # 无约束类型
Num = TypeVar('Num', int, float) # 受限类型def first(item:Sequence[T]) -> T:return item[0]def sums(values:Sequence[Num])->Num:return sum(values)#####
def get_first_item(items:T) -> T:if items:return items[0]raise ValueError("列表为空")numbers = [1,2,3,4,5]
words = ['apple','banana','cherry','fruit']print(get_first_item(numbers))
print(get_first_item(words))

 

http://www.dtcms.com/a/284320.html

相关文章:

  • 在 Windows Server RDS 上配置用户配置文件磁盘查找对应的用户名
  • 第2章通用的高并发架构设计——2.5 高并发读场景总结:CQRS
  • 【计算机网络】第四章:网络层(上)
  • Spring中事务失效的情况深度分析
  • 深入理解 KVM 子系统:从虚拟化核心到内核实现的全景解析
  • 7.18 note
  • 第十八节:第三部分:java高级:反射-获取构造器对象并使用
  • 【参数初始化】——深度学习.全连接网络
  • Cadence SPB 2024软件下载及安装教程|Cadence软件安装详细步骤附下载链接
  • Spring IoCDI_2_使用篇
  • Anime.js 超级炫酷的网页动画库详解
  • 【图像质量评价指标】信噪比(Signal-to-Noise Ratio,SNR)
  • Linux 基础指令
  • makefile missing separator. Stop.问题
  • 一款实用的.NET Core加密解密工具类库
  • C++11之lambda表达式与包装器
  • 20.轮廓特征与近似,改变图像的轮廓识别画线的精确度,同时画出轮廓对应的矩形
  • GitHub 趋势日报 (2025年07月16日)
  • 【Burp入门第三十八篇】Repeater Strike:AI 驱动的 Burp Suite 插件
  • Effective Modern C++ 条款13:优先考虑const_iterator而非iterator
  • Magenta RT 正式开源!实时生成多种风格音乐,让创作无门槛
  • 【C++详解】STL-stack、queue的模拟实现,容器适配器,deque双端队列介绍
  • Java 大视界 -- Java 大数据在智能交通智能公交站台乘客流量预测与服务优化中的应用(349)
  • 19.删除链表的倒数第 N 个结点
  • 多线程--sem_wait(sem)特殊用法
  • 拿到安全工程师证后,能从事哪些岗位?
  • C函数实现strcopy strcat strcmp strstr
  • javax.servlet.http.HttpServletResponse;API导入报错解决方案
  • Kotlin集合与空值
  • 产品经理如何绘制流程图