Le système d'événements en Python
Ce système d'événements pour Python utilisez-vous? Je suis déjà au courant de pydispatcher, mais je me demandais à quoi d'autre peut être trouvé, ou est couramment utilisé?
Je ne suis pas intéressé par les gestionnaires d'événements qui font partie des cadres de grandes, je préfère utiliser un petit bare-bones solution que je peut facilement s'étendre.
Vous devez vous connecter pour publier un commentaire.
Enveloppant les différents systèmes à événements qui sont mentionnés dans les réponses ici:
Le plus de style de base de système d'événements est le "sac de méthodes de gestionnaire", qui est une simple mise en œuvre de la Modèle observateur. Fondamentalement, les méthodes de gestionnaire d' (callables) sont stockées dans un tableau et chacune est appelée lorsque l'événement "feux".
list
.set
au lieu d'unlist
pour stocker le sac, et met en œuvre__call__
qui sont à la fois raisonnable ajouts.L'inconvénient de ces systèmes est que vous ne pouvez enregistrer les gestionnaires sur l'Événement réel de l'objet (ou les gestionnaires de la liste).
Ainsi, au moment de l'enregistrement de l'événement a déjà besoin d'exister.
C'est pourquoi le deuxième style de systèmes à événements: la publish-subscribe modèle.
Ici, les gestionnaires ne vous inscrivez pas sur un objet événement (ou gestionnaire de liste), mais sur un répartiteur central. Aussi les auteurs de la notification de parler à l'expéditeur. Ce qu'il faut écouter, ou de quoi publier est déterminée par "signal", qui n'est rien de plus qu'un nom (chaîne de caractères).
QObject
.Remarque: le filetage.L'événement n'est pas un "système", dans le sens indiqué ci-dessus. C'est un thread système de synchronisation où un thread attend jusqu'à ce qu'un autre thread "signaux" de l'objet d'Événement.
Note: ne figurent pas ci-dessus sont pypydispatcher, python-expédition et le "crochet" de pluggy pourrait être d'intérêt.
J'ai fait de cette façon:
Cependant, comme avec tout le reste je l'ai vu, il n'y a pas d'auto-généré pydoc pour cela, et pas de signatures, qui aspire vraiment.
_bag_of_handlers
qui est une liste de. La classe de la méthode add serait tout simplementself._bag_of_handlers.append(some_callable)
. La classe de feu de la méthode loop thru` _bag_of_handlers le décès de la condition args et kwargs pour les gestionnaires et l'exécution de chacune dans l'ordre.add
méthode vous venez d'ajouter utiliser comme vous le feriez pour n'importe quelle liste. Au lieu de lafire
méthode de cette classe d'Événements qui utilise la __appel__` méthode magique.Nous utilisons un EventHook comme suggéré de Michael Foord dans son Cas Motif:
Juste ajouter EventHooks à vos classes avec:
Nous ajouter la fonctionnalité de suppression de tous les écouteurs d'un objet à Michaels de classe et qui a abouti à ceci:
self.__handlers = [h for h in self._handlers if getattr(h, 'im_self', False) != obj]
- Je utiliser zope.l'événement. C'est le plus essentiel que vous pouvez imaginer. 🙂
En fait, voici le code source complet:
Notez que vous ne pouvez pas envoyer de messages entre les processus, par exemple. Ce n'est pas un système de messagerie, juste un système d'événement, rien de plus, rien de moins.
J'ai trouvé ce petit script sur Apprécié Des Leçons. Il semble avoir juste le droit de la simplicité/rapport de puissance je suis après. Peter Thatcher est l'auteur de code suivant (pas de licence est mentionné).
Vous pouvez avoir un coup d'oeil à pymitter (pypi). Son un petit fichier unique (~250 loc) approche
"offrir des espaces de noms, les jokers et TTL".
Voici un exemple de base:
J'ai créé un
EventManager
classe (code à la fin). La syntaxe est la suivante:Voici un Exemple:
De sortie:
EventManger Code:
Ici est d'un design minimaliste qui devrait fonctionner correctement. Ce que vous avez à faire est de simplement hériter
Observer
dans une classe et ensuite utiliserobserve(event_name, callback_fn)
à écouter pour un événement précis. Chaque fois que cet événement spécifique est tiré de n'importe où dans le code (c'est à dire.Event('USB connected')
), le rappel de feu.Exemple:
J'ai fait une variation de Longpoke est minimaliste approche qui assure également la signature pour les deux fonctions appelées et les appelants:
Si je ne code pyQt j'utilise QT sockets/signaux de paradigme en est de même pour django
Si je fais des e/S asynchrone-je utiliser natif sélectionnez le module
Si je suis avec un SAX python analyseur je suis en utilisant les événements de l'API fournie par SAX. Donc, on dirait que je suis victime de l'API sous-jacente 🙂
Peut-être vous posez-vous qu'attendez-vous de structure d'événement/module. Ma préférence personnelle est de l'utilisation de Socket/Signal paradigme de l'intervalle QT. plus d'informations à ce sujet peuvent être trouvées ici
Voici un autre module pour examen. Il semble un choix viable pour les applications les plus exigeantes.
Si vous vouliez faire plus de choses compliquées comme la fusion d'événements ou de réessayer, vous pouvez utiliser le motif Observable et de la maturité de la bibliothèque qui implémente cette. https://github.com/ReactiveX/RxPY . Les phénomènes Observables sont très fréquents dans le Javascript et le Java et très pratique à utiliser pour certaines tâches asynchrones.
SORTIE:
Vous pouvez essayer
buslane
module.Cette bibliothèque permet la mise en œuvre de message basé sur un système plus facile. Il prend en charge les commandes (seul gestionnaire) et les événements (0 ou plusieurs gestionnaires) approche. Buslane utilise Python annotations de type à enregistrer correctement gestionnaire.
Exemple Simple:
Pour installer buslane, il suffit d'utiliser pip:
Il y a quelques temps, j'ai écrit de la bibliothèque qui pourrait être utile pour vous.
Il vous permet d'avoir le local et le global auditeurs, de plusieurs façons différentes de les enregistrer, de priorité d'exécution et ainsi de suite.
Ont un look pyeventdispatcher