Обратный вызов, наблюдатели и асинхронные сокеты в Python - PullRequest
0 голосов
/ 28 февраля 2010

Я все еще начинающий программист на Python, и я пытаюсь сделать что-то, что немного над моей головой.

Я создал простого IRC-бота с использованием asyncore (и модуля асинхронных сокетов). Клиент работает в непрерывном цикле, слушая разговор в канале. То, что я хотел бы сделать (я думаю?), Реализовать шаблон наблюдателя, чтобы я мог реагировать на события. Я думаю, это будет выглядеть примерно так:

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

Я строю этот дизайн вокруг того, что я знаю о наблюдателях, используемых в различных средах Javascript. Я не знаю, можно ли применить ту же технику здесь. Есть предложения?

1 Ответ

2 голосов
/ 28 февраля 2010

Хотя Observer не очень популярный DP (шаблон проектирования) в Python, он также не является полностью "чужим", поэтому, если вы с ним знакомы, продолжайте. Однако нормальный способ вызова observe был бы с handler=self.log_join, обратным вызовом, который на самом деле вызывается, не со строковым значением, заставляющим bot выполнить самоанализ, чтобы выяснить, что на самом деле имеет вызывать, когда происходит событие (и даже не давать ему self для ссылки на объект, который он должен выполнять при самоанализе - дрожать!).

Callback - вполне разумный и популярный DP в Python, но это потому, что передача первоклассных вызываемых объектов (функций, связанных методов, классов, экземпляров классов с помощью метода __call__ и т. Д., И т. Д.) Так чудесна легко (на самом деле довольно тривиально; -).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...