Подходящее выражение "ничего не делать" лямбда в питоне?

Иногда я нахожусь в том, что хочу сделать слова "не делать ничего" лямбда-выражения, похожие на высказывание:

def do_nothing(*args):
    pass

Но следующий синтаксис является незаконным, поскольку лямбда-выражения пытаются вернуть все, что есть после двоеточия, и вы не можете вернуть pass.

do_nothing = lambda *args: pass

Поэтому мне было интересно, будет ли следующее выражение подходящей заменой для вышеупомянутого?

do_nothing = lambda *args: None

Так как функция do_nothing выше технически возвращает None, можно ли сделать лямбда-выражение, которое возвращает None для использования в качестве выражения lambda-заполнителя? Или это плохая практика?

Ответ 1

Эта:

def do_nothing(*args):
    pass

эквивалентно:

lambda *args: None

С некоторыми незначительными отличиями в этом есть lambda а другой нет. (Например, __name__ будет do_nothing по функции и <lambda> на лямбда.) Не забывайте о **kwargs, если это имеет для вас значение. Функции в Python без явного return <x> return None. Это здесь:

Вызов всегда возвращает некоторое значение, возможно, 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)
>>>

Примечание

Сделайте себе одолжение для будущего и **kwargs обработку **kwargs. Если вы когда-нибудь попытаетесь использовать его где-то глубоко в своем коде, и вы забыли, что он не принимает 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 x: x

Чтобы вернуть ни одного, вы можете написать

lambda x: None

Ответ 4

Это самое простое выражение лямбда:

do_nothing = lambda: None

Никаких необходимых аргументов и минимального требуемого возврата.