A suitable 'do nothing' lambda expression in python?

后端 未结 5 1734
遥遥无期
遥遥无期 2020-12-25 09:05

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

def do_nothing(*args):
    pass

B

相关标签:
5条回答
  • 2020-12-25 09:47

    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.
    
    0 讨论(0)
  • 2020-12-25 09:49

    This is the simplest lambda expression:

    do_nothing = lambda: None
    

    No arguments required and the minimal required return.

    0 讨论(0)
  • 2020-12-25 10:01

    If you truly want a full do nothing function, make sure to take *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

    Do yourself a favor for the future and include the **kwargs handling. If you ever try to use it 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'
    
    0 讨论(0)
  • 2020-12-25 10:03

    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

    0 讨论(0)
  • 2020-12-25 10:06

    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.

    0 讨论(0)
提交回复
热议问题