Python 2.7.10
J'ai écrit le code suivant pour tester une fonction de rappel simple.
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))
Je reçois ceci quand je l'exécute:
Sum = 3
Add any two digits.
Pourquoi Add any two digits
est après Sum = 3
? Je suppose que c'est parce que la fonction de rappel s'exécute en premier. Comment exécuter la fonction de rappel après que tout le code dans main()
a été exécuté
callback
seul ne fait rien. Il accepte les paramètres.
Le fait que vous ayez d'abord utilisé callback(1, 2)
appelle cette fonction, imprimant ainsi Sum = 3
.
Puisque callback
ne renvoie aucune valeur explicite, il est retourné sous la forme None
. Votre code est donc équivalent à
callback(1, 2)
main()
Vous pouvez essayer de ne pas appeler la fonction au début et de simplement passer son handle.
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)
Comme mentionné dans les commentaires, votre rappel est appelé chaque fois qu'il est suffixé de parenthèses ouvrantes et fermantes; ainsi il s'appelle quand vous le passez.
Vous voudrez peut-être utiliser un lambda et transmettre les valeurs.
#!/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 __== "__main__":
main(lambda x, y: x+y, 1, 2)
Voici ce que tu voulais faire:
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)
Le problème est que vous évaluez le rappel avant de le transmettre en tant que callable. Voici un moyen flexible de résoudre le problème:
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)
Vous pouvez éventuellement inclure un moyen de prendre en charge les arguments de mots clés.
Votre code est exécuté comme suit:
main(callback(1, 2))
La fonction callback
est appelée avec (1, 2)
et renvoie None
(sans instruction return, votre fonction imprime Sum = 3
et renvoie None
)
La fonction main
est appelée avec l'argument None
(donc callback != None
sera toujours False
)