Python のデコレータで iife
◆ デコレータを使えばいい感じに関数の即時実行できた
◆ 受け取った関数を実行した結果を返す関数を作る
◆ 作った関数をデコレータとして即時実行したい関数に設定する
◆ 受け取った関数を実行した結果を返す関数を作る
◆ 作った関数をデコレータとして即時実行したい関数に設定する
Python で関数の即時実行をしたいとき def は式にならないし lambda は 1 つしか文しか書けないし書きづらいです
lambda で無理やりやるのは見づらくなるので やるとしたら def です
しかし 関数定義と実行に分かれます
即時実行なのに分けるのはこれじゃない感じがします
分けてしまうとスコープに関数が残ります
1 回限りじゃなく 後でどこかで実行されるかもと思って読むことになって脳内メモリをムダに使うことになります
言語の制約上仕方ないと思ってましたが デコレータを使えばいい感じにできそうです
デコレータを関数に設定すると 関数定義時にその関数が引数としてデコレータに渡されます
デコレータが返した結果が関数定義によって作られる関数になります
ここで返すものは関数に制限されていません
好きな型の値で良くて 数値を返せば数値が変数に入ります
受け取った関数を実行して返り値をそのまま返す関数を iife という名前で作ってその関数をデコレータとして即時実行したい関数につけます
lambda で無理やりやるのは見づらくなるので やるとしたら def です
しかし 関数定義と実行に分かれます
def foo():
a = 1
b = 2
return a + b
value = foo()
print(value)
# 3
即時実行なのに分けるのはこれじゃない感じがします
分けてしまうとスコープに関数が残ります
1 回限りじゃなく 後でどこかで実行されるかもと思って読むことになって脳内メモリをムダに使うことになります
言語の制約上仕方ないと思ってましたが デコレータを使えばいい感じにできそうです
デコレータを関数に設定すると 関数定義時にその関数が引数としてデコレータに渡されます
デコレータが返した結果が関数定義によって作られる関数になります
ここで返すものは関数に制限されていません
好きな型の値で良くて 数値を返せば数値が変数に入ります
受け取った関数を実行して返り値をそのまま返す関数を iife という名前で作ってその関数をデコレータとして即時実行したい関数につけます
iife = lambda f: f()
@iife
def value():
a = 1
b = 2
return a + b
print(value)
# 3