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

发布时间:2026/6/28 9:26:00

“|”不只是按位或,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 ba.__and__(b)按位与a | ba.__or__(b)按位或a ^ ba.__xor__(b)按位异或~aa.__invert__()按位取反用 | 打造你的数据流水线要实现这样优雅的管道式调用我们只需要定义几个简单的类。首先是所有任务的基类 Runnable它规定了所有可运行任务必须实现 run 方法同时重载了 __or__ 运算符让两个任务可以用 | 连接成一个链。class Runnable: def run(self, data): raise NotImplementedError def __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 data def __or__(self, other): return Chain(*self.steps, other)有了这两个基类我们就可以像搭积木一样定义各种单一职责的处理步骤了。每个步骤只需要继承 Runnable 并实现自己的 run 方法即可。class AddOne(Runnable): def run(self, data): return data 1 class MulTwo(Runnable): def run(self, data): return data * 2 class ToStr(Runnable): def run(self, data): return f结果是: {data}现在我们可以用最直观的方式把这些步骤串起来chain AddOne() | MulTwo() | ToStr() print(chain.run(5)) # 结果是: 12

相关新闻