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()
内の他のすべてのコードが実行された後にコールバック関数を実行する方法は?
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)
コメントで述べたように、コールバックは、開いた丸括弧と閉じた丸括弧で接尾辞が付けられたときに呼び出されます。したがって、渡すときに呼び出されます。
ラムダを使用して値を渡すことができます。
#!/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)
あなたがしたいことは次のとおりです。
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)
問題は、呼び出し可能として渡す前にコールバックを評価していることです。問題を解決する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)
オプションで、キーワード引数をサポートする方法を含めることができます。
コードは次のように実行されます。
main(callback(1, 2))
callback
関数は(1, 2)
で呼び出され、None
を返します(returnステートメントなしで、関数はSum = 3
を出力し、None
を返します)
main
関数は、None
を引数として呼び出されます(したがって、callback != None
は常にFalse
になります)