lambda*args,**kwargs:无

Scr*_*ffy 26 python lambda default-arguments

考虑:

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' )
Run Code Online (Sandbox Code Playgroud)

这样做的动机是我不需要输入逻辑来检查是否已经分配了回调,因为它默认为blank_fn,它什么都不做.

这有效,但是有一些原因我不应该这样做吗?它是pythonic吗?有没有更好的方法呢?是否内置了:

lambda *args, **kwargs: None
Run Code Online (Sandbox Code Playgroud)

Chr*_*ker 39

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

def blank_fn(*args, **kwargs):
    pass
Run Code Online (Sandbox Code Playgroud)

但是,我认为更加pythonic的方法是:

def perform_task(callback=None):
    print 'doing stuff'
    if callback is not None:
        callback('x', 'y', z='z')
Run Code Online (Sandbox Code Playgroud)

不需要调用什么都不做的函数.真值测试比函数调用便宜.

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
Run Code Online (Sandbox Code Playgroud)

  • 有时候,perform_task会执行一些复杂的工作,并且您希望尽可能多地考虑它.采用blank_fn方式的许多小步骤可以产生一个漂亮,易于管理的代码.通常,保持代码清洁而不是优化代码更为重要. (5认同)
  • 好.我想如果我确实有一个合法的默认回调我可以def它并默认传递它.否则我会用无聊的旧如果......没有:布莱什! (2认同)