web-dev-qa-db-ja.com

簡単なコールバック関数を書く方法は?

Python 2.7.1

簡単なコールバック関数をテストするために、次のコードを作成しました。

_def callback(a, b):
    print('Sum = {0}'.format(a+b))

def main(callback=None):
    print('Add any two digits.')
    if callback != None:
        callback

main(callback(1, 2))
_

私はそれを実行するとこれを受け取ります:

_Sum = 3
Add any two digits.
_

なぜ_Add any two digits_は_Sum = 3_の後にあるのですか?コールバック関数が最初に実行されるためだと思います。 main()内の他のすべてのコードが実行された後にコールバック関数を実行する方法は?

9
srgbnd

callback自体は何もしません。パラメーターを受け入れます。

callback(1, 2)を最初に実行すると、その関数が呼び出され、Sum = 3

callbackは明示的な値を返さないため、Noneとして返されるため、コードは

callback(1, 2)
main()

最初は関数を呼び出さずに、そのハンドルを渡すだけで済みます。

def callback(sum):
    print("Sum = {}".format(sum))

def main(a, b, callback = None):
    print("adding {} + {}".format(a, b))
    if callback:
        callback(a+b)

main(1, 2, callback)
27
cricket_007

コメントで述べたように、コールバックは、開いた丸括弧と閉じた丸括弧で接尾辞が付けられたときに呼び出されます。したがって、渡すときに呼び出されます。

ラムダを使用して値を渡すことができます。

#!/usr/bin/env python3

def main(callback=None, x=None, y=None):
    print('Add any two digits.')
    if callback != None and x != None and y != None:
        print("Result of callback is {0}".format(callback(x,y)))
    else:
        print("Missing values...")

if __name__ == "__main__":
    main(lambda x, y: x+y, 1, 2)
3
erip

あなたがしたいことは次のとおりです。

def callback(a, b):
    print('Sum = {0}'.format(a+b))

def main(a,b,f=None):
    print('Add any two digits.')
    if f != None:
        f(a,b)

main(1, 2, callback)
3
Eric Duminil

問題は、呼び出し可能として渡す前にコールバックを評価していることです。問題を解決する1つの柔軟な方法は次のとおりです。

def callback1(a, b):
    print('Sum = {0}'.format(a+b))

def callback2(a):
    print('Square = {0}'.format(a**2))

def callback3():
    print('Hello, world!')

def main(callback=None, cargs=()):
    print('Calling callback.')
    if callback != None:
        callback(*cargs)

main(callback1, cargs=(1, 2))
main(callback2, cargs=(2,))
main(callback3)

オプションで、キーワード引数をサポートする方法を含めることができます。

1
farsil

コードは次のように実行されます。

main(callback(1, 2))

callback関数は(1, 2)で呼び出され、Noneを返します(returnステートメントなしで、関数はSum = 3を出力し、Noneを返します)

main関数は、Noneを引数として呼び出されます(したがって、callback != Noneは常にFalseになります)

0
ettanany