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)

Основной поток:

  1. Если функция, которая обрабатывает входящие PRIVMSG, находит ! в первом символе trailing данные в отправляет данные в process_bot_command()
  2. process_bot_command() выскакивает первая порция trailing Строка, опускает !, prepends bot_и звонки getattr() найти функцию с этим именем.
  3. Если функция найдена, входные данные передаются функции.
  4. Если функция не найдена, ввод передается 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() чтобы он умер, за исключением вас, ребята, в комментариях, и функции соединения / части начали работать. Затем я добавил его обратно, чтобы посмотреть, смогу ли я выяснить, почему он ломался, но код продолжает работать.

Понятия не имею почему, но, думаю, проблема решена?

0 ответов

Другие вопросы по тегам