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

21. “|”不只是按位或,90%的人不知道

提到 Python 中的|,绝大多数开发者的第一反应都是按位或运算,5 | 3 = 7 是我们初学编程时就烂熟于心的基础。但很少有人知道,| 还能像这样用:

动画视频在《21. “|”不只是按位或,90%的人不知道》。

chain = AddOne() | MulTwo() | ToStr()
print(chain.run(5))

Python 里的 | 不只是按位或,90% 的人不知道它还能这么用。一个符号就能把多个函数串成一条流水线,数据从左到右自动流动,代码像管道一样直观。这不是什么黑魔法,而是 Python 一个极其强大但被严重低估的特性 ——运算符重载。今天我们就来彻底解锁 | 运算符的隐藏技能,顺便揭秘 LangChain 中大名鼎鼎的 LCEL 表达式语言的核心原理。

运算符不是语法特权,只是语法糖

很多人觉得 +、-、*、| 这些运算符是 Python 内置的 "特殊语法",只能用于数字、字符串等基本类型。但实际上,Python 中所有运算符都对应着一个特殊的魔法方法。当你写 a | b 时,Python 解释器会自动将其转换为 a.__or__(b)。

这就是整个秘密的核心。只要我们在自己的类中定义了 __or__ 方法,就能完全自定义 | 运算符的行为。不仅是 |,理论上你可以重写所有运算符,让它们实现任何你想要的功能。

运算符 对应方法 默认含义
a & b a.__and__(b) 按位与
a | b a.__or__(b) 按位或
a ^ b a.__xor__(b) 按位异或
~a a.__invert__() 按位取反

用 | 打造你的数据流水线

要实现这样优雅的管道式调用,我们只需要定义几个简单的类。首先是所有任务的基类 Runnable,它规定了所有可运行任务必须实现 run 方法,同时重载了 __or__ 运算符,让两个任务可以用 | 连接成一个链。

class Runnable:def run(self, data):raise NotImplementedErrordef __or__(self, other):return Chain(self, other)

接下来是核心的 Chain 类,它本身也继承自 Runnable,这意味着一个任务链本身也是一个可运行的任务。Chain 会把所有步骤按顺序保存起来,执行时依次调用每个步骤的 run 方法,把前一步的输出作为后一步的输入。它也重载了 __or__ 方法,支持给已经存在的链继续追加新的步骤。

class Chain(Runnable):def __init__(self, *runnables):self.steps = list(runnables)def run(self, data):for step in self.steps:data = step.run(data)return datadef __or__(self, other):return Chain(*self.steps, other)

有了这两个基类,我们就可以像搭积木一样定义各种单一职责的处理步骤了。每个步骤只需要继承 Runnable 并实现自己的 run 方法即可。

class AddOne(Runnable):def run(self, data):return data + 1class MulTwo(Runnable):def run(self, data):return data * 2class ToStr(Runnable):def run(self, data):return f"结果是: {data}"

现在,我们可以用最直观的方式把这些步骤串起来:

chain = AddOne() | MulTwo() | ToStr()
print(chain.run(5))  # 结果是: 12

| 让代码像管道一样直观,数据从左到右流动,一目了然。下次要讲的 LCEL 核心原理就是这个。

http://www.jsqmd.com/news/859438/

相关文章:

  • 5.21 广州实时金价|本地人卖黄金,3 家回收商横向对比 - 资讯快报
  • 告别示波器?用Keil MDK自带的Logic Analyzer调试你的GPIO状态(以STM32F103为例)
  • 盐印相风格生成失败率骤降83%:基于2000+真实案例的7维诊断矩阵(含CMYK通道偏移校准表)
  • 别再只用CEEMDAN了!峭度、能量熵、模糊熵...7种特征指标到底怎么选?一篇讲透
  • 三本书助你提升领导力、成为高绩效领导者
  • 别再只画图了!AUV结构设计避坑指南:从材料选择、密封防水到流体仿真(Ansys实战)
  • 【ElevenLabs希腊文语音实战指南】:20年AI语音工程师亲测的5大发音优化技巧与3个避坑红线
  • 变频器厂家选购指南:如何挑选靠谱的工业驱动服务商 - 资讯速览
  • 114. 二叉树展开为链表
  • 2026门窗十大品牌排名:黑马品牌冲上,系统窗成主流趋势! - 资讯速览
  • 终极Windows 11优化指南:如何使用Win11Debloat让你的系统焕然一新
  • 从模拟路由器到跑Docker:解锁EVE-NG被低估的“全能虚拟机”玩法(附Linux/Windows镜像导入指南)
  • 终极指南:3分钟为Axure RP 9/10/11安装中文语言包,彻底告别英文界面困扰
  • 2026年苏州国际学校一年学费多少?家长参考指南 - 品牌排行榜
  • PADS Logic/Layout新手避坑指南:从栅格到铺铜,这8个基础设置千万别乱动
  • 2026年做疾病动物模型的公司服务与选择指南 - 品牌排行榜
  • 二次元游戏模组管理革命:XXMI启动器带你开启游戏个性化新时代
  • 用TensorFlow 2.x复现LeNet-5:从论文公式到可运行代码的保姆级拆解
  • 深度解析:三坐标检测哪家好?技术原理与选型指南 - 资讯速览
  • 如何在3分钟内为Windows安装苹果设备驱动:终极解决方案指南 [特殊字符]
  • 年省百万成本:变频器厂家破解化工生产难题 - 资讯速览
  • MCP电路设计:从门电路到CPLD的优先级仲裁硬件实现
  • 终极指南:在Windows上快速搭建SSHFS远程文件系统
  • 2026淮南婚纱摄影优选榜单|权威测评各大机构实力对比 - 江湖评测
  • ARM SVE PRFB指令:向量化预取技术详解与优化实践
  • 常州黄金回收行业综合实力排名TOP10,2026年5月权威测评榜单 - 天天生活分享日志
  • Cursor Free VIP技术解析:如何通过设备标识重置机制实现AI编程助手持续使用
  • 影刀RPA 企业级专题篇:AI调度融合与自学习自动化系统架构实践
  • 别再死记硬背了!用Python从零实现图像缩放与旋转,彻底搞懂双线性插值
  • 近期短视频运营找哪家?5大关键维度选型参考 - 资讯快报