为什么Python中没有多行Lambda?

501 投票
24 回答
307970 浏览
提问于 2025-04-15 13:23

我听说过,Python 不支持多行的 lambda 表达式,因为这样会和其他语法结构产生冲突。今天我在公交车上思考这个问题,发现我想不出任何一个 Python 的语法结构会和多行 lambda 冲突。这让我感到很惊讶,因为我对这个语言还是比较了解的。

我相信 Guido(Python 的创始人)一定有他的理由不把多行 lambda 加入语言中,但出于好奇:有没有什么情况是使用多行 lambda 会让人感到困惑的?我听到的这个说法是真的吗,还是说 Python 不允许多行 lambda 是因为其他原因?

24 个回答

86

这通常看起来很糟糕(但有时候其他的选择更糟),所以一个解决办法是使用大括号表达式:

lambda: (
    doFoo('abc'),
    doBar(123),
    doBaz())

不过,这种方法不允许你进行任何赋值,所以你得提前准备好数据。我发现这个方法在PySide这个封装库中很有用,因为有时候你需要写一些简短的回调函数。如果写额外的成员函数会显得更糟糕。通常情况下,你并不需要这样做。

例子:

pushButtonShowDialog.clicked.connect(
    lambda: (
    field1.clear(),
    spinBox1.setValue(0),
    diag.show())
842

Python的创始人Guido van Rossum在一篇旧博客中亲自回答了这个问题。
简单来说,他承认从理论上讲这是可能的,但任何提出的解决方案都不符合Python的风格:

“不过,我觉得任何提出的解决方案都非常复杂:这需要解析器(更准确地说,是词法分析器)能够在对缩进敏感和不敏感的模式之间来回切换,还要保持之前模式和缩进级别的记录。从技术上讲,这些问题都可以解决(实际上已经有一个缩进级别的堆栈可以被推广)。但这并没有改变我内心的感觉,这一切就像是一个复杂的鲁布·戈德堡机器。”

184

看看下面的内容:

map(multilambda x:
      y=x+1
      return y
   , [1,2,3])

这个 lambda 表达式是返回 (y, [1,2,3]) 吗?这样的话,map 只会得到一个参数,就会出错。还是说它返回的是 y?或者说这是个语法错误,因为新行上的逗号放错地方了?Python 怎么知道你想要什么呢?

在括号内,缩进对 Python 来说并不重要,所以你不能明确地处理多行代码。

这只是一个简单的例子,可能还有更多类似的情况。

撰写回答