コールバック関数って?
コールバック関数とは、プログラム中で、呼び出し先の関数の実行中に実行されるように、あらかじめ指定しておく関数。
http://e-words.jp/w/%E3%82%B3%E3%83%BC%E3%83%AB%E3%83%90%E3%83%83%E3%82%AF%E9%96%A2%E6%95%B0.html
関数の引数として渡す関数とも説明されることもあります。
使用方法
リンク先の記事まんまです
http://qiita.com/pocket8137/items/df5afba90b51e90587a5
まずはコールバック関数を呼び出す関数を定義。
def handler(func,*args):
return func(*args)
第一引数が関数ポインタ、第二引数が可変引数です。第二引数にてコールバック関数の引数を受け取ります。
そして、コールバック関数を定義
def say_hello(name):
print("Hello!!")
print(name)
呼び出します。
ちなみに、Pythonでは関数名に()をつけないことで関数ポインタを指します。
if __name__ == "__main__":
callback = say_hello
#callbackにsay_helloのオブジェクトIDを格納
handler(callback, "moroku0519")
実行結果
Hello!!
moroku0519
どういったことに使ったか
私の場合、場合によって使用する関数を分けたいなと思う場面がありました。
そこで、オブジェクトIDを格納した辞書を定義しました。
def handler(func, *args):
return func(*args)
def function1(hoge):
return hoge
def function2(hoge, huga):
return hoge, huga
func_dic = {"func1": function1, "func2": function2}
result1 = handler(func_dic["func1"], hoge)
result2, result3 = handler(func_dic["func2"], hoge, huga)
コメント
@shiracamus(編集済み)
7
@hatt0519(編集済み) 2
@seigot(編集済み)
0
pythonには「関数ポインタ」はなくて、関数だろうとインスタンスだろうと数値だろうとすべてオブジェクトで「オブジェクトID」が割り当てられていて、オブジェクトIDが辞書に登録されます。
オブジェクトIDはid関数で調べられ、オブジェクトが何者かはtypeコマンドで調べられます。
()
を付けると__call__
メソッドを呼び出すことになり、関数だけでなくlambda関数やクラスやメソッドも呼び出せます。__call__
メソッドを持たない数値などはエラーになりますけど。intのサブクラスを作って無理やり数値を関数呼び出しすることも可能ではあります。
丁寧なご説明ありがとうございます!
便利な記事をありがとうございます!引数がなくてもhandlerから実行できました!