debug_chain = RunnablePassthrough(lambda data: (print("write_query execution result:", data["query"]), data)[1])
我们来看这段代码时,其实可以把它拆成两部分来理解。这个 lambda 匿名函数的核心作用是:在数据流中打印出调试信息(这里打印 data[“query”] 的值),同时不改变传入的数据,继续把原始数据传递下去。
分步说明
假设链中传递的数据是一个字典,比如:
data = {"query": "SELECT * FROM Playlist;","other_info": "some other data"
}
下面我们详细解释 lambda 函数的每个部分:
lambda data: (print("write_query execution result:", data["query"]), data)[1]
-
lambda data: …
- 这定义了一个匿名函数,接收一个参数
data
。 - 在我们的例子中,
data
就是上面的字典。
- 这定义了一个匿名函数,接收一个参数
-
(print(“write_query execution result:”, data[“query”]), data)
-
这里创建了一个元组,有两个元素:
- 第一个元素:
print("write_query execution result:", data["query"])
- 当这个表达式执行时,会打印出:
write_query execution result: SELECT * FROM Playlist;
- 注意:
print()
函数在 Python 中执行后会返回None
。
- 第二个元素:
- 就是原始的
data
字典。
- 就是原始的
- 第一个元素:
-
因此,如果我们在函数中传入上面的
data
,元组就相当于:(None, {"query": "SELECT * FROM Playlist;", "other_info": "some other data"})
-
-
[1]
- 这个部分是对上面元组进行索引,取索引为 1 的元素,也就是第二个元素,即原始的
data
。 - 最终,整个 lambda 函数的返回值就是原始传入的
data
。
- 这个部分是对上面元组进行索引,取索引为 1 的元素,也就是第二个元素,即原始的
具体举例说明
下面用一个完整的例子来说明这个 lambda 函数的作用:
# 定义匿名函数
my_lambda = lambda data: (print("write_query execution result:", data["query"]), data)[1]# 构造一个示例数据字典
sample_data = {"query": "SELECT * FROM Playlist;","result": None
}# 调用匿名函数
returned_data = my_lambda(sample_data)
执行过程:
-
当调用
my_lambda(sample_data)
时,lambda 函数内部先执行:print("write_query execution result:", sample_data["query"])
这行代码会输出:
write_query execution result: SELECT * FROM Playlist;
-
然后,构造的元组是:
(None, sample_data)
-
索引
[1]
取到了sample_data
,所以my_lambda(sample_data)
的返回值依然是:{"query": "SELECT * FROM Playlist;", "result": None}
总结:
- 这段代码的语法利用了 lambda 表达式创建一个匿名函数,用元组来同时完成“打印调试信息”和“返回原数据”两个任务。
- 使用元组的原因是我们希望在不改变数据的情况下执行
print
这个副作用操作,然后依旧把原始数据传递到流水线的下一步。
这样,在链中调用这个调试函数时,你就可以看到生成的 SQL 查询被打印出来,同时数据本身也没有受到影响,继续传递给后续步骤。