Подходящее выражение "ничего не делать" лямбда в питоне?
Иногда я нахожусь в том, что хочу сделать слова "не делать ничего" лямбда-выражения, похожие на высказывание:
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
Никаких необходимых аргументов и минимального требуемого возврата.