2010-02-28 5 views
0

Je suis toujours un programmeur Python néophyte et j'essaie de faire quelque chose qui me dépasse un peu.Rappel, observateurs et sockets asynchrones en Python

Ce que j'ai fait est de créer un bot IRC simple en utilisant asyncore (et le module de sockets asynchrones). Le client court dans une boucle continue, écoutant la conversation dans le canal. Qu'est-ce que je voudrais faire (je pense?) Est la mise en œuvre d'un modèle d'observateur afin que je puisse répondre aux événements. J'imagine qu'il regarderait somthing comme ceci:

class MyBot(object): 

    def __init__(self): 
     bot = MyIRCClient(server='whatever', channel='#whatever') 
     bot.observe(event='join', handler='log_join') 
     bot.connect() # Bot is now listening continously in a loop 

    def log_join(self, e): 
     print e + ' joined the channel.' 

Je fonde cette conception autour de ce que je connais des observateurs utilisés dans les différents cadres Javascript. Je ne sais pas si la même technique peut ou devrait être appliquée ici. Aucune suggestion?

Répondre

2

Alors que Observer n'est pas un DP (motif de design) particulièrement populaire en Python, ce n'est pas vraiment un "alien" non plus, alors si vous le connaissez, allez-y. Cependant, la manière normale d'appeler observe serait avec handler=self.log_join, un rappel qui est réellement un callable, pas avec une valeur de chaîne obligeant le bot à effectuer une introspection pour savoir ce qu'il doit réellement appeler lorsque l'événement se produit (et même pas en lui donnant un self pour faire référence à l'objet qu'il est censé effectuer introspection on - shudder!). Est un DP parfaitement raisonnable et populaire en Python, mais c'est parce que passer des callables de première classe (fonctions, méthodes liées, classes, instances de classes avec une méthode __call__, etc, etc) est si merveilleusement facile (joli trivial, en fait ;-).

Questions connexes