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 语句,它啥都不做?