getattr() может найти некоторые функции, но не другие
В рамках учебного проекта я пишу простого IRC-бота и реализовал простые текстовые функции, такие как !auth
, !join
, !say
и т. д. Чтобы упростить добавление функций, я реализовал каждую из них в python как bot_auth()
, bot_join()
, bot_say()
и т. д., с прорывом к bot_NOCOMMAND()
это регистрирует ошибку.
У меня проблема в том, что в то время как большинство функций находятся getattr()
как и ожидалось join
а также part
функций нет, и я не могу понять, почему.
Код:
def process_bot_command(self, prefix, params, trailing):
# eg: !command some arguments
try:
bot_command,bot_args = trailing[1:].split(' ',1)
bot_command = bot_command.lower().strip()
bot_args = bot_args.strip()
except ValueError:
bot_command = trailing[1:].split(' ')[0].lower().strip()
bot_args = ''
try:
function = getattr(self, 'bot_'+bot_command)
function(prefix, params[0], bot_command, bot_args)
except AttributeError:
self.bot_NOCOMMAND(prefix, params[0], bot_command, bot_args)
def bot_NOCOMMAND(self, c_from, c_to, command, args):
self.log('Undefined command: %s' % ','.join([c_from, c_to, command, args]), 1)
def bot_auth(self, c_from, c_to, command, args):
user = self.parsePrefix(c_from)['name']
if self.authenticate(user, args):
self.irc_PRIVMSG(user, 'Authentication successful.')
self.admins.append(c_from)
self.log('Added %s to active admin list.' % c_from)
else:
self.irc_PRIVMSG(user, 'Authentication failed.')
# TODO: doesn't work for some reason
def bot_join(self, c_from, c_to, command, args):
if not self.isAdmin(c_from):
self.respond(c_from, c_to, self.str['unauth'])
return
channel = args.split(' ')[0].strip()
self.irc_JOIN(channel)
self.respond(c_from, c_to, 'Joining %s' % channel)
# TODO: doesn't work for some reason
def bot_part(self, c_from, c_to, command, args):
if not self.isAdmin(c_from):
self.respond(c_from, c_to, self.str['unauth'])
return
channel = args.split(' ')[0].strip()
if channel in self.subscribed_channels:
self.irc_PART(channel, 'Leaving channel')
self.respond(c_from, c_to, 'Left %s' % channel)
def bot_say(self, c_from, c_to, command, args):
if not self.isAdmin(c_from):
self.respond(c_from, c_to, self.str['unauth'])
return
if args[0] == '#':
channel,text = args.split(' ', 1)
self.irc_PRIVMSG(channel, text)
else:
self.respond(c_from, c_to, args)
Основной поток:
- Если функция, которая обрабатывает входящие PRIVMSG, находит
!
в первом символеtrailing
данные в отправляет данные вprocess_bot_command()
process_bot_command()
выскакивает первая порцияtrailing
Строка, опускает!
, prependsbot_
и звонкиgetattr()
найти функцию с этим именем.- Если функция найдена, входные данные передаются функции.
- Если функция не найдена, ввод передается
bot_NOCOMMAND()
который сбрасывает ввод в журнал как ошибку.
Пример вывода:
> Sammitch!~Sammitch@hostname.tld PRIVMSG JerkfaceMcAssbot :!auth password
* Authentication request for user: Sammitch succeeded.
< PRIVMSG Sammitch :Authentication successful.
* Added Sammitch!~Sammitch@hostname.tld to active admin list.
> Sammitch!~Sammitch@hostname.tld PRIVMSG JerkfaceMcAssbot :!identify
< PRIVMSG nickserv :IDENTIFY password
< PRIVMSG Sammitch :Sent identify command.
> NickServ!NickServ@services. NOTICE JerkfaceMcAssbot :You are now identified for JerkfaceMcAssbot.
> Sammitch!~Sammitch@hostname.tld PRIVMSG JerkfaceMcAssbot :!join ##systemadmins
! Undefined command: Sammitch!~Sammitch@hostname.tld,JerkfaceMcAssbot,join,##systemadmins
> Sammitch!~Sammitch@hostname.tld PRIVMSG JerkfaceMcAssbot :!part KitchenCommandCenter
! Undefined command: Sammitch!~Sammitch@hostname.tld,JerkfaceMcAssbot,part,KitchenCommandCenter
например:
! Undefined command: Sammitch!~Sammitch@hostname.tld,JerkfaceMcAssbot,join,##systemadmins
Значит это get_attr()
не могу найти функцию с именем bot_join()
,
Я не могу понять, почему только bot_join()
а также bot_part()
функции не хотят работать, в то время как все остальные работают просто отлично. Может ли кто-нибудь просветить меня, что может быть не так?
Обновить
Я прокомментировал попытку / поймать от process_bot_command()
чтобы он умер, за исключением вас, ребята, в комментариях, и функции соединения / части начали работать. Затем я добавил его обратно, чтобы посмотреть, смогу ли я выяснить, почему он ломался, но код продолжает работать.
Понятия не имею почему, но, думаю, проблема решена?