Відповідний лямбда-вираз "нічого не робити" у python?


80

Іноді я виявляю бажання змусити заповнювач "нічого не робити" лямбда-вирази, подібні до висловлювання:

def do_nothing(*args):
    pass

Але наступний синтаксис є незаконним, оскільки лямбда-вирази намагаються повернути те, що є після двокрапки, і ви не можете повернути pass.

do_nothing = lambda *args: pass

Тож мені було цікаво, чи наведений нижче вираз є підходящою заміною для вищезазначеного?

do_nothing = lambda *args: None

Оскільки do_nothingфункція, наведена вище, технічно повертається None, чи добре робити лямбда-вираз, який повертається Noneдо використання як замінник лямбда-виразу? Або це погана практика?


Він робить те саме, що і do_nothingфункція, але незрозуміло, чому для цього потрібно використовувати a lambda.
BrenBarn

Я хотів використовувати lambdaсуто для читабельності коду, оскільки я особисто не шанувальник вкладених функцій, і програма, в якій я хотів би використовувати вираз, була б третьою вкладеною функцією. Мене також просто цікавлять інші думки щодо використання цього кодування.
user3002473

1
В ідіоматичному Python прийнято більшість місць, де вам не знадобиться нічого не робити None, навіть якщо вона не викликається. Дотепність:filter(None, alist)
Коджіро

6
Оскільки всі функції нічого не роблять однаково нічого, ви можете просто визначити do_nothingв одному місці, а потім передавати, do_nothingколи ви хочете передати нічого не робити. Не потрібно перевизначати його за допомогою нової лямбда-функції (або повнофункціональної функції def) кожного разу, коли ви хочете її використовувати.
BrenBarn

mock.Mock()може бути вашим фіктивним викликом, приймаючи будь-які параметри. Але це повертає черговий Макет, і це може призвести до дивних помилок. Змінити його на mock.Mock(return_value=None)може бути як і раніше помилковим, оскільки ви можете спробувати отримати з нього атрибут, і це буде працювати, повертаючи інший Макет.
Ctrl-C

Відповіді:


99

Це:

def do_nothing(*args):
    pass

еквівалентно:

lambda *args: None

З деякими незначними відмінностями в тому, що один є, lambdaа один ні. (Наприклад, __name__буде і do_nothingна функції, і <lambda>на лямбда.) Не забувайте про те **kwargs, якщо це для вас важливо. Функції в Python без явного return <x>повернення None. Це тут :

Виклик завжди повертає якесь значення, можливо None, якщо не викликає виняток.

Я використовував подібні функції як значення за замовчуванням, скажімо, наприклад:

def long_running_code(progress_function=lambda percent_complete: None):
    # Report progress via progress_function.

Добре, дякую за пораду! Я, мабуть, піду на пропозицію BrenBarn зробити глобальну do_nothingфункцію.
user3002473

39

Якщо ви справді хочете повноцінну функцію нічого не робити, обов’язково візьміть *args і *kwargs .

noop = lambda *args, **kwargs: None

У всій своїй славній дії

>>> noop = lambda *args, **kwargs: None
>>> noop("yes", duck_size="horse", num_ducks=100)
>>>

Бічна примітка

Зробіть собі прихильність на майбутнє і включіть **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'

16

Іноді лямбда-функції використовуються для перетворення даних, і в цьому випадку 'нічого не робити' означає повернути введені дані, тобто

lambda x: x

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

lambda x: None


Це не те саме, що функція бездіяльності, яка повертає None.
BrenBarn

4
Мені подобається ця думка. Це більше схоже на мультиплікатив, identityніж do_nothing. Можливо, є випадок, щоб мати кожного з них.
Пітер Вуд,

10

Це найпростіший лямбда-вираз:

do_nothing = lambda: None

Не потрібні аргументи та мінімальна необхідна віддача.


2

У Python 3 вам навіть не потрібно визначати будь-які функції для цього. Виклик type(None)буде повертати вам NoneTypeконструктор, який можна використовувати для нічого не робити: type(None)(). Майте на увазі, що NoneTypeконструктор бере лише 0 аргументів.

У Python 2 , однак, створення примірників NoneTypeнеможливо, тому lambda: Noneце має найбільший сенс.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.