跳到内容

unnecessary-lambda (PLW0108)

源自 Pylint 代码检查工具。

有时提供修复。

此规则不稳定且处于预览状态。使用需要 --preview 标志。

作用

检查由单个函数调用组成的 lambda 定义,该函数调用具有与 lambda 本身相同的参数。

为什么这不好?

lambda 用于包装函数调用,并且仅仅将 lambda 参数传递给该函数时,通常可以用该函数本身替换它,从而消除一个间接级别。

示例

df.apply(lambda x: str(x))

建议改为

df.apply(str)

修复安全性

此规则的修复被标记为不安全,主要有两个原因。

首先,lambda 主体本身可能包含副作用。

例如,将 lambda x, y: (func()(x, y)) 替换为 func() 会导致行为发生变化,因为 func() 会在定义 lambda 时立即计算,而不是在调用 lambda 时计算。

但是,即使 lambda 主体本身是纯的,lambda 也可能会更改参数名称,这可能会导致调用者按名称传递参数时行为发生变化。

例如,将 foo = lambda x, y: func(x, y) 替换为 foo = func,其中 func 定义为 def func(a, b): return a + b,对于通过按名称传递参数来执行 lambda 的调用者来说,这将是一个重大更改,如:foo(x=1, y=2)。 由于 func 没有像 lambda 那样定义参数 xy,因此该调用将引发 TypeError