管道运算符的工作原理
为了理解 LCEL 和管道运算符的工作原理,我们创建自己的管道兼容函数。
当 Python 解释器在两个对象之间看到 | 运算符(如 a | b)时,它会尝试将对象 a 传递给对象 b 的 or 方法。这意味着这些模式是等价的:
对象方法
chain = a.__or__(b)
chain("一些输入")
管道方法
chain = a | b
chain("一些输入")
考虑到这一点,我们可以构建一个 Runnable 类,它接受一个函数并将其转换为可以使用管道运算符 | 与其他函数链接的函数。
class Runnable:
def __init__(self, func):
self.func = func
def __or__(self, other):
def chained_func(*args, **kwargs):
# 其他函数使用这个函数的结果
return other(self.func(*args, **kwargs))
return Runnable(chained_func)
def __call__(self, *args, **kwargs):
return self.func(*args, **kwargs)
让我们实现这个,取值 3,加上 5(得到 8),然后乘以 2,最后期望得到 16。
def add_five(x):
return x + 5
def multiply_by_two(x):
return x * 2
使用 Runnable 包装这些函数
add_five = Runnable(add_five)
multiply_by_two = Runnable(multiply_by_two)
使用对象方法运行它们
chain = add_five.__or__(multiply_by_two)
print(chain(3)) # (3 + 5) * 2 = 16
直接使用 or 我们会得到正确答案,让我们尝试使用管道操作符 | 将它们链接在一起:
将可运行的函数链接在一起
chain = add_five | multiply_by_two
print(chain(3)) # (3 + 5) * 2 = 16
无论使用哪种方法,我们都会得到相同的响应,这就是 LCEL 在链接组件时使用的管道逻辑。