首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >lambda *args,**kwargs:无

lambda *args,**kwargs:无
EN

Stack Overflow用户
提问于 2013-08-03 03:12:08
回答 2查看 41.3K关注 0票数 37

考虑一下:

代码语言:javascript
复制
blank_fn = lambda *args, **kwargs: None

def callback(x, y, z=''):
    print x, y, z

def perform_task(callback=blank_fn):
    print 'doing stuff'
    callback('x', 'y', z='z' )

这样做的动机是我不需要放入逻辑来检查是否分配了回调,因为它缺省为blank_fn,它什么也不做。

这是可行的,但是有什么原因我不应该这么做吗?它是蟒蛇吗?有没有更好的方法呢?有没有内置的:

代码语言:javascript
复制
lambda *args, **kwargs: None
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-03 03:18:52

根据PEP8的说法,您应该“始终使用def语句,而不是直接将lambda表达式绑定到名称的赋值语句”。所以,我要改变的一件事是:

代码语言:javascript
复制
def blank_fn(*args, **kwargs):
    pass

然而,我认为一种更具pythonic风格的方法是:

代码语言:javascript
复制
def perform_task(callback=None):
    print 'doing stuff'
    if callback is not None:
        callback('x', 'y', z='z')

不应该有任何需要调用一个什么也不做的函数。真值测试比函数调用更便宜。

代码语言:javascript
复制
def do_nothing(*args, **kwargs): pass
def do_something(arg, callback=do_nothing):
    a = 1 + 2
    callback('z', z='z')
def do_something_else(arg, callback=None):
    a = 1 + 2
    if callback is not None:
        callback('z', z='z')

%timeit do_something(3)
1000000 loops, best of 3: 644 ns per loop

%timeit do_something_else(3)
1000000 loops, best of 3: 292 ns per loop
票数 49
EN

Stack Overflow用户

发布于 2019-02-23 00:41:48

我认为前面的答案更好,因为它提供了一种更好的方法来完成OP想要做的事情。

然而,当您在测试时需要noop函数,或者您正在修补某些东西时,可能会有争议的情况。

因此,要按要求回答OP问题,您可以使用Mock:

代码语言:javascript
复制
In [1]: from mock import Mock

In [2]: blank_fn = Mock(return_value=None)

In [3]: blank_fn()

In [4]: blank_fn("foo")

In [5]: blank_fn(bar="foo")

In [6]: blank_fn("foobar", bar="foo")

In [7]: 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18024503

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档