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


77

有时我发现自己想让占位符“不做任何事情” lambda表达式,类似于说:

def do_nothing(*args):
    pass

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

do_nothing = lambda *args: pass

所以我想知道,下面的表达式是否可以替代上面的表达式?

do_nothing = lambda *args: None

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


它的do_nothing功能与功能相同,但尚不清楚为什么需要为此使用a lambda
BrenBarn'3

我想lambda纯粹是为了代码的可读性,因为我个人并不喜欢嵌套函数,而我想在其中使用表达式的应用程序将是第三个嵌套函数。我也只是对使用此编码Trope的其他意见感兴趣。
user3002473 2014年

1
在惯用的Python中,多数情况下您都需要执行空操作功能accept None,即使它不可调用。智慧:filter(None, alist)
kojiro 2014年

6
由于所有的“不执行”功能都没有执行相同的操作,因此您可以只do_nothing在一个地方进行定义,然后do_nothing在您希望通过不执行任何操作时通过。每次使用时,都不需要使用新的lambda(或全功能def)重新定义它。
BrenBarn 2014年

mock.Mock()可以是您的虚拟可调用对象,可以接受任何参数。但是它返回了另一个Mock,可能会导致奇怪的错误。将其更改mock.Mock(return_value=None)为仍可能有问题,因为您可以尝试从中获取属性,并且该属性将起作用,并返回另一个Mock。
Ctrl-C

Answers:


94

这个:

def do_nothing(*args):
    pass

等效于:

lambda *args: None

有一些细微的差异,一个是a lambda,一个不是。(例如,__name__将出现do_nothing在函数和<lambda>lambda上。)**kwargs如果对您很重要,请不要忘记。Python中的函数,没有显式return <x>返回None。这是这里

调用总是返回某个值,可能会返回None,除非它引发异常。

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

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

好的,谢谢您的建议!我可能会接受BrenBarn关于创建全局do_nothing函数的建议。
user3002473 2014年

38

如果您确实想要完全不执行任何操作,请确保采用*args *kwargs

noop = lambda *args, **kwargs: None

在所有光荣的行动中

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

边注

帮自己一个美好的未来,包括**kwargs处理。如果您曾经尝试在代码中的某个深处使用它,却忘记了它没有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'

15

有时,lambda函数用于数据转换,在这种情况下,“不执行任何操作”意味着返回输入,即

lambda x: x

要不退还,您可以写

lambda x: None


这与返回None的不做任何事情函数不同。
BrenBarn 2014年

4
我喜欢这个想法。这更像乘identitydo_nothing。也许每个都有一个。
彼得·伍德

10

这是最简单的lambda表达式:

do_nothing = lambda: None

不需要参数,并且需要最小回报。


2

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

不过,在Python 2中,创建的实例NoneType是不可能的,因此lambda: None这是最有意义的。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.