python中合适的“啥都不做” lambda表达式?

Posted

技术标签:

【中文标题】python中合适的“啥都不做” lambda表达式?【英文标题】:A suitable 'do nothing' lambda expression in python?python中合适的“什么都不做” lambda表达式? 【发布时间】:2014-05-09 10:11:49 【问题描述】:

我有时会发现自己想做占位符“什么都不做”的 lambda 表达式,类似于说:

def do_nothing(*args):
    pass

但以下语法是非法的,因为 lambda 表达式试图返回冒号后的任何内容,而您无法返回 pass

do_nothing = lambda *args: pass

所以我想知道,下面的表达式是否适合替换上面的表达式?

do_nothing = lambda *args: None

由于上述do_nothing 函数在技术上返回None,是否可以创建一个返回None 的lambda 表达式用作占位符lambda 表达式?还是不好的做法?

【问题讨论】:

它确实和do_nothing函数做同样的事情,但不清楚为什么你需要为它使用lambda 我想使用lambda 纯粹是为了代码的可读性,因为我个人不喜欢嵌套函数,而我想在其中使用表达式的应用程序将是第三个嵌套函数。我也只是对有关使用此编码比喻的其他意见感兴趣。 在惯用的 Python 中,大多数需要无操作函数的地方都会接受 None,即使它不可调用。也就是说:filter(None, alist) 由于所有的无操作函数都什么都不做,你可以在一个地方定义do_nothing,然后在你想传递一个无操作的时候传递do_nothing。无需每次使用时都使用新的 lambda(或完整函数 def)重新定义它。 mock.Mock() 可以是您的虚拟可调用对象,接受任何参数。但它返回另一个 Mock 并且可能会导致奇怪的错误。将其更改为 mock.Mock(return_value=None) 仍然存在问题,因为您可以尝试从中获取属性,它会起作用,返回另一个 Mock。 【参考方案1】:

这个:

def do_nothing(*args):
    pass

相当于:

lambda *args: None

其中一个是lambda,一个不是。 (例如,__name__ 在函数上将是 do_nothing,在 lambda 上将是 <lambda>。)不要忘记 **kwargs,如果它对您很重要。 Python 中没有显式 return <x> 的函数返回 None。这是here:

调用总是返回一些值,可能是 None,除非它引发异常。

我使用了类似的函数作为默认值,例如:

def long_running_code(progress_function=lambda percent_complete: None):
    # Report progress via progress_function.

【讨论】:

【参考方案2】:

如果你真的想要一个完整的无操作功能,请确保吞噬*args *kwargs

noop = lambda *args, **kwargs: None

在所有光荣的行动中

>>> noop = lambda *args, **kwargs: None
>>> noop("yes", duck_size="horse", num_ducks=100)
>>>

旁注

由于接受的答案仅使用*args,我必须指出,您将通过包含**kwargs 处理为您自己的未来提供帮助。如果您曾经尝试在代码深处的某个地方使用noop,而您忘记了它采用kwargs,那将是什么都不做的例外:

In [2]: do_nothing('asdf', duck="yes")
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-efbd722f297c> in <module>()
----> 1 do_nothing('asdf', duck="yes")

TypeError: <lambda>() got an unexpected keyword argument 'duck'

【讨论】:

【参考方案3】:

有时 lambda 函数用于数据转换,在这种情况下,“什么都不做”意味着返回输入,即

lambda x: x

不返回你可以写

lambda x: None

【讨论】:

这与返回 None 的无操作函数不同。 我喜欢这个想法。它更像是乘法 identity 而不是 do_nothing。也许每个都有一个案例。【参考方案4】:

这是最简单的 lambda 表达式:

do_nothing = lambda: None

不需要任何参数,并且需要最小的返回值。

【讨论】:

【参考方案5】:

Python 3 中,您甚至不需要为此定义任何函数。调用type(None) 将返回NoneType 构造函数,您可以将其用于什么都不做:type(None)()。请记住,NoneType 构造函数只接受 0 个参数。

但是,在 Python 2 中,创建 NoneType 的实例是不可能的,所以 lambda: None 最有意义。

【讨论】:

以上是关于python中合适的“啥都不做” lambda表达式?的主要内容,如果未能解决你的问题,请参考以下文章

无服务器调用本地啥都不做

python ftp 服务器显示“150 文件状态正常。即将打开数据连接。”啥都不做

是否有一个 JavaScript 等价于 Python pass 语句,它啥都不做?

如何编写一个在给定时间长度内啥都不做的函数? [复制]

应用程序(helanzb)是一个系统猪,nice 19 啥都不做

iOS UITapGestureRecognizer 啥都不做?