web-dev-qa-db-fra.com

Comment utiliser une fonction de rappel en python?

Je me demande comment utiliser correctement les fonctions de rappel python 2.7.

J'ai quelques fonctions de rappel d'exemples d'authentification Cherrypy dans mon code.

(Ces rappels renvoient une fonction qui peut être évaluée à Vrai ou Faux, selon que l'utilisateur connecté se trouve ou non dans un groupe.)

Je me demande si un rappel est exécuté ou non si j'écris un morceau de code comme celui-ci:

Étant donné la définition de la bibliothèque est:

def member_of(groupname):
    def check():
        if groupname == 'admin':
          if cherrypy.request.login == 'joe':
            return True
          if cherrypy.request.login == 'toni':
            return True
          return False
        return False
        # .... (other groups checked in the same way)
    return check # returns a callback function from my understanding?

Comment puis-je appliquer et exécuter le rappel dans mon code?

Si je le dis comme ceci:

 if member_of('admin'):
    do_something()
  else:
    do_something_else()

Est-ce que cela exécutera le rappel et vérifiera le groupe admin? Ou va-t-il savoir si la valeur de "member_of" est une définition de fonction et une définition de fonction est probablement toujours une valeur "True" (ou peut-être une valeur False) mais les deux sont erronées, car elle doit être exécutée

Pouvez-vous m'éclairer à ce sujet? Comment puis-je m'assurer qu'un rappel est exécuté? Comment puis-je le faire passer tel quel?

16
Alojz Janez

En python, comme dans de nombreux autres langages, une variable peut également contenir une fonction et vous pouvez les passer comme d'autres variables qui contiennent par exemple des nombres ou des chaînes.

La fonction member_of De CherryPy elle-même renvoie une fonction dans votre exemple.

Je l'explique en quelques étapes simples:

Si vous écrivez member_of() il retourne le résultat de la fonction member_of () qui est la fonction avec le nom check dans ce cas.

cb_function = member_of('admin')

À ce stade, la variable cb_function Contient le résultat de l'appel de la fonction member_of, Et dans la dernière ligne member_of Renvoie check, qui a été définie dans la fonction member_of Comme autre fonction!

Vous devez appeler à nouveau le premier résultat, car vous pouvez et vous devez le traiter presque de la même manière qu'une fonction locale, que vous avez définie dans le contexte actuel, pour obtenir le résultat final, en faisant quelque chose comme:

my_result =  cb_function()

Et puis vous continueriez et utiliseriez le résultat. Par exemple, vous pouvez vérifier sa valeur booléenne:

if my_result:
  # do something
  ...   

Les 3 étapes ci-dessus peuvent être écrites plus courtes:

cb_function = member_of('admin')
  if cb_function():
    # do something
    ...

Ou encore plus court:

if member_of('admin')():
  # do something
  ...  

Au début, cela peut sembler un peu étrange dans python pour avoir le double ()(), Mais si vous y réfléchissez un moment, cela a du sens.

15
mit

Si vous l'exécutez, c'est simple.

member_of() renverra la vérification des objets de la méthode. vous devez exécuter pour obtenir le résultat en faisant quelque chose comme if member_of('admin')(): or,

k=member_of('admin')
if k():

Pour faire votre tâche.

3
specialscope