A suitable 'do nothing' lambda expression in python?

Question:

I sometimes find myself wanting to make placeholder ‘do nothing’ lambda expressions, similar to saying:

def do_nothing(*args):
    pass

But the following syntax is illegal since lambda expressions attempt to return whatever is after the colon, and you can’t return pass.

do_nothing = lambda *args: pass

So I was wondering, would the following expression be a suitable replacement for the above?

do_nothing = lambda *args: None

Since the do_nothing function above technically returns None, is it okay to make a lambda expression that returns None to use as a placeholder lambda expression? Or is it bad practice?

Asked By: user3002473

||

Answers:

Sometimes lambda functions are used for data transformation, and in that case ‘do nothing’ means to return the input, i.e.

lambda x: x

To return none you can write

lambda x: None

Answered By: Paul

This:

def do_nothing(*args):
    pass

is equivalent to:

lambda *args: None

With some minor differences in that one is a lambda and one isn’t. (For example, __name__ will be do_nothing on the function, and <lambda> on the lambda.) Don’t forget about **kwargs, if it matters to you. Functions in Python without an explicit return <x> return None. This is here:

A call always returns some value, possibly None, unless it raises an exception.

I’ve used similar functions as default values, say for example:

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

If you truly want a full do nothing lambda function, make sure to gobble up *args and *kwargs.

noop = lambda *args, **kwargs: None

In all its glorious action

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

Side Note

Since the accepted answer is only using *args, I must point out that you will do yourself a favor for the future by including the **kwargs handling. If you ever try to use the noop somewhere deep away in your code and you forgot that it doesn’t take kwargs, it will be quite the Exception to doing nothing:

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'
Answered By: Kyle Kelley

This is the simplest lambda expression:

do_nothing = lambda: None

No arguments required and the minimal required return.

Answered By: Rafa0809

In Python 3 you don’t even need to define any functions for that. Calling type(None) will return you the NoneType constructor, which you can use for doing nothing: type(None)(). Keep in mind that the NoneType constructor only takes 0 arguments.

In Python 2, though, creating instances of NoneType is impossible, so lambda: None would make the most sense.

Answered By: Arthur Khazbs

Besides this expression

lambda *args: None

there is another graceful expression using Ellipsis:

lambda *args: ...

This can also be useful in case the function has no arguments (callback for example):

lambda: None

lambda: ...
Answered By: Anton Ermakov
Categories: questions Tags: ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.