做一个Python IRC机器人的正确方法?

时间:2011-04-28 17:12:07

标签: python regex parsing sockets irc

所以我开始从头开始编写一个简单的过程Python IRC bot(即原始套接字),我正在努力设计出最好的设计方法。

通常我有一个很大的'while()循环,它会坐在那里并将从套接字接收的数据推送到缓冲区中,我将使用大量的if / else语句来扫描字符串(使用正则表达式)弄清楚该怎么做。我有一种感觉,我不应该这样做,因为它感觉很糟糕。

我决定制作正则表达式及其相关含义的字典,例如

regexes = {"^PING: (.+)": "incomming_ping",
           "more regex": "more meanings"}

只需使用for / in循环搜索文本并找出哪个正则表达式匹配它。我已经走到了这一步,我认为第一件事是“好吧,我可以让每个'程序'在特定的正则表达式与函数匹配时调用,并根据含义调用相应的函数。我'要么坚持使用大量的if / else语句,我首先不想做,或者我可以使用某种Pythonic'eval',它会立即引发警钟。

无论哪种方式,我都搞砸了,如果没有完全OOP,我想不出办法解决这个问题(我现在不打算这样做,不要问为什么)。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

def incoming_ping():
    pass

regexes = {"^PING: (.+)": incoming_ping,
           "more regex": "more meanings"}

使用对函数的引用,而不是字符串。

PS。如果你对IRC机器人事情“认真”,你可能想看看Twisted。

答案 1 :(得分:2)

编写一个通用的IRC协议解析器,它可以基于regexp。当命令遵循更通用的模式(^PING\s, ^PRIVMSG\s)时,为每个不同的命令(^[A-Z]\s)编写单独的正则表达式似乎有点多余。

然后,一旦解析了命令,就可以使用getattr(obj, 'irc_%s' % command)查找执行该命令的方法/函数。

优点是您不需要维护所有方法 plus 一个带有每个命令模式的映射表。

这是Twisted's IRC client中使用的技术:

def handleCommand(self, command, prefix, params):
    """Determine the function to call for the given command and call
    it with the given arguments.
    """
    method = getattr(self, "irc_%s" % command, None)
    try:
        if method is not None:
            method(prefix, params)
        else:
            self.irc_unknown(prefix, command, params)

def irc_JOIN(self, prefix, params):
    # perform the JOIN action
    ...

def irc_unknown(self, prefix, command, params):
    # unknown command
    ...