所以我开始从头开始编写一个简单的过程Python IRC bot(即原始套接字),我正在努力设计出最好的设计方法。
通常我有一个很大的'while()循环,它会坐在那里并将从套接字接收的数据推送到缓冲区中,我将使用大量的if / else语句来扫描字符串(使用正则表达式)弄清楚该怎么做。我有一种感觉,我不应该这样做,因为它感觉很糟糕。
我决定制作正则表达式及其相关含义的字典,例如
regexes = {"^PING: (.+)": "incomming_ping",
"more regex": "more meanings"}
只需使用for / in循环搜索文本并找出哪个正则表达式匹配它。我已经走到了这一步,我认为第一件事是“好吧,我可以让每个'程序'在特定的正则表达式与函数匹配时调用,并根据含义调用相应的函数。我'要么坚持使用大量的if / else语句,我首先不想做,或者我可以使用某种Pythonic'eval',它会立即引发警钟。
无论哪种方式,我都搞砸了,如果没有完全OOP,我想不出办法解决这个问题(我现在不打算这样做,不要问为什么)。
有什么想法吗?
答案 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
...