web-dev-qa-db-fra.com

Une expression lambda appropriée «ne rien faire» en python?

Je me retrouve parfois à vouloir faire des expressions lambda `` ne rien faire '', comme pour dire:

def do_nothing(*args):
    pass

Mais la syntaxe suivante est illégale car les expressions lambda tentent de renvoyer tout ce qui se trouve après les deux points, et vous ne pouvez pas retourner pass.

do_nothing = lambda *args: pass

Je me demandais donc si l'expression suivante serait un remplacement approprié pour ce qui précède?

do_nothing = lambda *args: None

Depuis le do_nothing la fonction ci-dessus renvoie techniquement None, est-il correct de créer une expression lambda qui renvoie None à utiliser comme expression lambda d'espace réservé? Ou est-ce une mauvaise pratique?

52
user3002473

Cette:

def do_nothing(*args):
    pass

est équivalent à:

lambda *args: None

Avec quelques différences mineures, on est un lambda et l'autre non. (Par exemple, __name__ Sera do_nothing Sur la fonction et <lambda> Sur le lambda.) N'oubliez pas **kwargs, Si cela est important pour toi. Fonctions en Python sans un return <x> Retour explicite None. C'est ici :

Un appel renvoie toujours une valeur, éventuellement None, sauf s'il déclenche une exception.

J'ai utilisé des fonctions similaires comme valeurs par défaut, disons par exemple:

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

Si vous voulez vraiment une fonction complète de ne rien faire, assurez-vous de prendre *argset*kwargs.

noop = lambda *args, **kwargs: None

Dans toute son action glorieuse

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

Note latérale

Rendez-vous service pour l'avenir et incluez le **kwargs manipulation. Si jamais vous essayez de l'utiliser quelque part au fond de votre code et que vous avez oublié qu'il ne fait pas prendre kwargs, ce sera une exception à ne rien faire:

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'
30
Kyle Kelley

Parfois, les fonctions lambda sont utilisées pour la transformation des données, et dans ce cas, `` ne rien faire '' signifie renvoyer l'entrée, c'est-à-dire.

lambda x: x

Pour n'en renvoyer aucun, vous pouvez écrire

lambda x: None

10
Paul

C'est l'expression lambda la plus simple:

do_nothing = lambda: None

Aucun argument requis et le retour minimal requis.

8
Rafa0809