Appel de fonctions

Le module call contient les fonctions destinés à faciliter l'appel de fonction, que ce soit de manière directe, en fonction de divers événements, ou entre différents threads.

Fonctions disponibles

La fonction safely permet d'appeler une fonction passée en paramètre (les autres paramètres spécifiés lui seront passés) sans déclencher d'erreur. Si une exception se déclenche durant le traitement de la fonction, elle est affichée sur la sortie d'erreur, et une valeur None est renvoyée sans interrompre le code appelant. Utile notamment pour les boucles d'appel d'écouteurs.

La fonction result appelle la fonction qu'on lui passe en paramètre (sans arguments) et renvoie son résultat. Elle peut donc être utilisée comme décorateur pour déterminer le contenu d'une variable sans polluer l'espace de nom.

La fonction override prend deux fonctions en paramètre renvoie la seconde après avoir copié divers arguments de la première. Elle est utilisée par quelques autres décorateurs de ce module pour remplacer une fonction par une autre de façon aussi transparente que possible.

Le décorateur selfdestructing sert à définir des fonctions à usage unique : au moment de leur appel, elles seront retirées de l'espace de nom de leur module d'origine. Cela peut permettre par exemple de définir une fonction pour gérer la boucle principal d'un programme et pour savoir si celle-ci a été déclenchée ou non.

Le décorateur locked permet de placer automatiquement un verrou lors de l'appel d'une fonction, pour éviter les usages concurrents par différents threads. Le verrou est retiré dès que l'exécution de la fonction se termine. Le décorateur prend un paramètre booléen, indiquant s'il faut utiliser un verrou réentrant ou non.

La fonction bind permet d'associer une fonction à la réception d'un signal. Il s'agit d'une version utilisable comme décorateur de la fonction signal.signal, permettant également de gérer les paramètres : elle prend le numéro du signal choisi et un booléen indiquant si les paramètres usuels (numéro de signal et frame) doivent être transmis ou non. Tout paramètre supplémentaire est automatiquement transmis à la fonction lors de son appel.

Le décorateur now sert comme son nom l'indique à appeler une fonction immédiatement après sa décoration. Il prend un paramètre booléen indiquant si cet appel doit être threadé ou non : si le paramètre vaut vrai, un nouveau thread (de type daemon, donc non-bloquant pour la fermeture du programme) est créé et déclenché, sinon la fonction est appelée dans le thread courrant. Tout paramètre supplémentaire est transmis à la fonction pour son exécution.

Le décorateur after permet d'appeler une fonction après un délai passé en paramètre (en secondes, les nombres à virgule étant acceptés pour définir un délai plus précis). Lors de sa première utilisation, un thread est créé et déclenché : tous les appels de fonctions utilisant ce décorateur auront lieu dans le thread en question. Tout paramètre supplémentaire est transmis à la fonction pour son exécution.

Le décorateur every repose sur le même principe que le précédent (et partage le même thread), mais réappelle périodiquement la fonction passée (avec les mêmes arguments).

Le décorateur bygtk permet de s'assurer qu'un appel de fonction sera exécuté par le thread dans lequel tourne la boucle principale GTK (a priori le thread principal, mais celui-ci peut éventuellement être précisé en paramètre). Hors condition particulière, il s'agit simplement de passer la fonction à GLib.idle_add plutôt que de l'appeler directement (en ajoutant le support des paramètres par mots-clefs, qui existe en python mais pas en GTK). Cependant, si le premier paramètre passé au décorateur vaut « vrai » et que l'appel de fonction se fait depuis un autre thread, on utilisera une queue.Queue pour tenter de récupérer la valeur de retour.

TODO : trois autres fonctions manquent encore pour le support de GTK : la possibilité de se connecter à un signal par un décorateur, et des équivalents à after/every qui utilisent la boucle principale GTK plutôt que de démarrer un thread à part. Ils seront ajoutés prochainement.

Le décorateur wait peut servir de boucle principale pour un programme : il utilise une queue.Queue pour attendre le prochain événement sur un écoutable passé en premier paramètre et appeler la fonction fournie. Tant que la valeur renvoyée par cette fonction vaut vrai, on continuera ensuite d'attendre l'événement suivant.