次のように、関数を引数として受け取る関数を定義するコードがあります。
def stuff(n, f):
f(n)
ここで、何もしない f のデフォルト値を提供したいと思います。だから私は次のようにパスを使うと思った:
def stuff(n, f = None):
if(f is None):
f = pass
f(n)
しかし、これはコンパイルされません。これをどのように行う必要がありますか?
次のように、関数を引数として受け取る関数を定義するコードがあります。
def stuff(n, f):
f(n)
ここで、何もしない f のデフォルト値を提供したいと思います。だから私は次のようにパスを使うと思った:
def stuff(n, f = None):
if(f is None):
f = pass
f(n)
しかし、これはコンパイルされません。これをどのように行う必要がありますか?
はpass
インタープリターのキーワードであり、それ以外の場合は何もないプレースホルダーです。割り当てることができるオブジェクトではありません。no-op ラムダを使用できます。
f = lambda x: None
なぜこれだけではないのですか?
def stuff(n, f=None):
if f is None:
return
return f(n)
少し短い:
def stuff(n, f=None):
f = f or (lambda x: None)
f(n)
またはさらに良い:
def stuff(n, f=None):
f(n) if f is not None else None
空っぽにすることはできません。ただし、に割り当てる内部関数を作成できますf
。
def stuff(n, f=None):
def empty(n):
pass
if f is None:
f = empty
f(n)
一般的な noop 関数:
f = lambda *x,**y:None
あなたは呼び出すことができます
f()
f(0,foo=0)
私は一緒に行きます
def nop(*args, **kwargs):
pass
def algo(func=nop):
do_something()
func()
do_something_else()
algo() # nop is called
algo(some_callback) # some_callback is called
私見はよりきれいに見えます
if foo:
foo()