2016-11-28 5 views
1

Python 2.7.10Wie schreibe ich eine einfache Callback-Funktion?

Ich schrieb den folgenden Code eine einfache Callback-Funktion zu testen.

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)) 

ich erhalten, als ich es ausführen:

Sum = 3 
Add any two digits. 

Warum Add any two digits nach Sum = 3 ist? Ich denke, das liegt daran, dass die Callback-Funktion zuerst ausgeführt wird. Wie wird die Callback-Funktion ausgeführt, nachdem der gesamte Code in main() ausgeführt wurde?

Antwort

9

callback auf eigene Faust nichts tun. Es akzeptiert Parameter.

Die Tatsache, dass Sie zuerst callback(1, 2) getan haben, ruft diese Funktion auf und gibt dabei Sum = 3 aus.

Da callback kehrt kein expliziter Wert, wird es als None zurückgegeben, so ist der Code

callback(1, 2) 
main() 

Sie könnten zu

Äquivalent nicht versuchen, die Funktion auf den ersten Aufruf und der Griff gerade vorbei.

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) 
+0

Gute Idee, die zwei Argumente vor dem Rückruf zu übergeben, damit der Dolmetscher etwas Arbeit für Sie erledigt! – erip

+1

@erip Wie meinst du das? Wie deine Antwort? –

+0

Ich meinte deins ist eine gute Idee. :) Das Erzwingen, dass der Benutzer die Argumente vor dem Rückruf übergibt, stellt sicher, dass sie existieren, damit kein Fehler auftritt, der 'main' aufruft. – erip

3

Wie in den Kommentaren erwähnt, wird Ihr Callback immer dann aufgerufen, wenn er mit öffnenden und schließenden Zeichen versehen ist. So heißt es, wenn du es passierst.

Vielleicht möchten Sie ein Lambda verwenden und die Werte übergeben.

#!/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) 
0

Das Problem ist, dass Sie den Rückruf sind bewerten, bevor Sie es als aufrufbare passieren. Eine flexible Möglichkeit, das Problem zu lösen, wäre wie folgt:

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) 

Optional können Sie eine Möglichkeit zur Unterstützung von Schlüsselwortargumenten hinzufügen.

0

Hier ist, was Sie tun wollte: ist

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) 
0

Ihr Code wie folgt ausgeführt:

main(callback(1, 2)) 

callback Funktion mit (1, 2) genannt wird, und es gibt None (ohne return-Anweisung, Ihre Funktion druckt Sum = 3 und returns None)

main Funktion wird mit None als Argument aufgerufen (So callback != None wird immer False sein)

Verwandte Themen