Bonjour,
Pour mon framework python pKNyX, je voudrais pouvoir faire ceci :
1 2 3 4 5
| class Toto(object):
@scheduler.interval_schedule(minutes=5)
def titi(self):
pass |
Or, ce décorateur n'est pas à proprement parler un wrapper : il enregistre le 'callable' décoré dans une table de jobs pour l'appeler ultérieurement. Or, ici, ça ne marche pas, puisque titi() est une 'unbound method'.
L'idée est donc de créer un décorateur spécial qui va enregistrer les méthodes décorées, puis, ultérieurement, pour chaque nouvelle instance de la classe Toto, enregistrer la méthode de cette instance dans APScheduler.
J'ai la chance que dans mon architecture, c'est le framework qui instancie les objets de la classe Toto, via un appel genre:
truc.register(Toto, name="mon_toto")
Je peux donc enregistrer la méthode de l'objet créé à ce moment là. Voici comment je pense procéder :
- dans mon décorateur spécial (qui ne wrappe pas non plus à proprement parler), je stocke la méthode (unbound) ;
- lorsque j'instancie un objet, via register(), je parcours mes méthodes stockées pour voir s'il n'y en a pas une de la classe de l'objet instancié (je peux pour ça utiliser stored_method.im_class et comparer à la classe passé à register()) ;
- j'enregistre la méthode d'objet correspondante dans APScheduler en utilisant stored_method.im_func(my_object).
Est-ce que ça vous paraît correct ? Y a-t-il plus propre que cette gymnastique ?
Partager