地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Python】pythonで学ぶコールバック関数とクロージャ

pythonで学ぶコールバック関数

コールバック関数とは

コールバック(英: Callback)とは、プログラミングにおいて、他のコードの引数として渡されるサブルーチンである。これにより、低レベルの抽象化層が高レベルの層で定義されたサブルーチン(または関数)を呼び出せるようになる。

一般に、まず高レベルのコードが低レベルのコードにある関数を呼び出すときに、別の関数へのポインタやハンドルを渡す。低レベルの関数を実行中に、その渡された関数を適当な回数呼び出して、部分タスクを実行する場合もある。別の方式では、低レベル関数は渡された関数を「ハンドラ」として登録し、低レベルの層で非同期的に(何らかの反応の一部として)後で呼び出すのに使う。

コールバックは、ポリモーフィズムとジェネリックプログラミングの単純化された代替手法であり、ある関数の正確な動作は、その低レベル関数に渡される関数ポインタ(ハンドラ)によって変わってくる。これは、コード再利用の非常に強力な技法と言える。

参照 : コールバック (情報工学))

def apply_async(func, args, callback):
    result = func(*args)
    callback(result)

def add(x, y):
    return x + y

def print_result(result):
    print('Result:', result)

def make_handler():
    sequence = 0
    def handler(result):
        nonlocal sequence
        sequence += 1
        print('[{}] Result: {}'.format(sequence, result))
    return handler

handler = make_handler()

apply_async(add, (2, 3), callback=handler)
apply_async(add, (2, 3), callback=handler)
クロージャ
def createCounter():
    cnt = [0]
    print("running createCounter")

    def inner():
        cnt[0] += 1  # cnt[0] = cnt[0] + 1
        print(cnt)
        print("running inner")
    return inner

counter = createCounter()

counter() #=> innnerが実行される
counter() #=> innnerが実行される
counter() #=> innnerが実行される