Lambda * args, ** kwargs: None

рассмотреть следующие вопросы:

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, которое просто ничего не делает.

Это работает, но есть ли причина, по которой я не должен этого делать? Это пифонический? Есть ли лучший способ сделать это? Есть ли встроенный для:

lambda *args, **kwargs: None

Ответы

Ответ 1

В соответствии с PEP8 вам следует "Всегда использовать инструкцию def, а не оператор присваивания, который привязывает лямбда-выражение непосредственно к имени". Итак, я бы изменил одно:

def blank_fn(*args, **kwargs):
    pass

Однако, я думаю, что более питонический способ сделать это:

def perform_task(callback=None):
    print 'doing stuff'
    if callback is not None:
        callback('x', 'y', z='z')

Не нужно вызывать функцию, которая ничего не делает. Проверка значения истины дешевле, чем вызов функции.

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