views:

67

answers:

1

I'm still a neophyte Python programmer and I'm trying to do something that is a bit over my head.

What I've done is create a simple IRC bot using asyncore (and asynchronous sockets module). The client runs in a continuous loop, listening to the conversation in the channel. What I would like to do (I think?) is implement an observer pattern so I can respond to events. I imagine it would look somthing like this:

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.'

I'm basing this design around what I know of observers used in the various Javascript frameworks. I don't know if the same technique can or should be applied here. Any suggestions?

+2  A: 

While Observer is not a particularly popular DP (design pattern) in Python, it's not a totally "alien" one either, so if you're familiar with it, go right ahead. However, the normal way to call observe would be with handler=self.log_join, a callback that's actually a callable, not with a string value forcing the bot to perform introspection to find out what it actually has to call when the event occurs (and not even giving it a self to refer to the object it's supposed to perform introspection on -- shudder!).

Callback is a perfectly reasonable and popular DP in Python, but that's because passing around first-class callables (functions, bound methods, classes, instances of classes with a __call__ method, etc, etc) is so wonderfully easy (pretty trivial, actually;-).

Alex Martelli