web-dev-qa-db-fra.com

Comment écrire une simple fonction de rappel?

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é

6
srgbnd

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

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

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)
2
Eric Duminil

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.

0
farsil

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)

0
ettanany