2013-08-02 5 views
18

считают:лямбда * Args, ** kwargs: Нет

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 
+5

Использование 'lambda' для определения именованной функции не является Pythonic, no. Используйте 'def'. – geoffspear

ответ

31

Согласно PEP8, вы должны «Всегда использовать четкости заявление вместо оператора присваивания, который связывает лямбда-выражение непосредственно к имени.» Так, одна вещь, которую я хотел бы изменить это:

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 
+1

Хорошо. Я полагаю, что если бы у меня был законный обратный вызов по умолчанию, я мог бы определить его и передать его по умолчанию. В противном случае я буду использовать скучный старый, если ... None :. Blech! – Scruffy

+0

Спасибо за очень полезное редактирование! – Bahrom

+0

Иногда бывает, что perform_task выполняет сложную работу, и вы хотите как можно больше повлиять на нее. Многие небольшие шаги, такие как принятие пустого_fn пути, могут привести к хорошему, управляемому коду. И часто важно сохранить код чистым, а не оптимизировать его. –

 Смежные вопросы

  • Нет связанных вопросов^_^