web-dev-qa-db-ja.com

Pythonで適切な「何もしない」ラムダ式?

私は時々、プレースホルダーを「何もしない」ラムダ式にしたいと思うことがあります。

def do_nothing(*args):
    pass

しかし、ラムダ式はコロンの後のものを返そうとするため、次の構文は違法であり、passを返すことはできません。

do_nothing = lambda *args: pass

だから、私は疑問に思っていました、次の式は上記の適切な代替品でしょうか?

do_nothing = lambda *args: None

do_nothing上記の関数は技術的にNoneを返しますが、Noneを返すラムダ式を作成して、プレースホルダーラムダ式として使用することはできますか?それとも悪い習慣ですか?

52
user3002473

この:

def do_nothing(*args):
    pass

以下と同等です:

lambda *args: None

1つはlambdaであり、1つはそうではないという点で若干の違いがあります。 (たとえば、__name__は関数ではdo_nothing、ラムダでは<lambda>になります。重要な場合は、**kwargsを忘れないでください。 Python明示的なreturn <x> return Noneなしの関数。これは here

呼び出しは、例外を発生させない限り、常に何らかの値、おそらくNoneを返します。

たとえば、次のようなデフォルト値として同様の関数を使用しました。

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

完全に何もしない機能が本当に必要な場合は、必ず*argsおよび*kwargs

noop = lambda *args, **kwargs: None

すべての栄光ある行動において

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

サイドノート

未来への賛成をして、**kwargs処理。コードのどこか深いところで使用しようとして、それを忘れた場合does n't take 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'
30
Kyle Kelley

ラムダ関数がデータ変換に使用されることがあります。その場合、「何もしない」とは、入力を返すことを意味します。

lambda x: x

何も返さないために、あなたは書くことができます

lambda x: None

10
Paul

これは最も単純なラムダ式です。

do_nothing = lambda: None

引数は不要で、最小限の戻り値が必要です。

8
Rafa0809