Вызываемая функция из yaml - PullRequest
0 голосов
/ 28 мая 2020

Я пытаюсь реализовать CommandHandler, который читает словарь команд из .yml и должен вызывать метод на основе ввода пользователя

commands.yml:

'help': {
    'message': 'message',
    'help': 'help-message',
    'action': help_command
},
'news': {
    'message': 'news-message',
    'help': 'help-message',
    'action': news_command
}

CommandHandler .py:

def handle_command(self, command, parameters, message):
    self.commands.get(command).get('action')(parameters, message)

Я получаю TypeError: 'str' is not callable. С. json это та же ошибка. Сохранение его как commands.py и его импорт дает мне NameError: name 'help_command' is not defined.

Однако, если я просто вставлю dict в код напрямую, он будет работать нормально. Есть ли какое-нибудь решение, кроме прямого определения dict в коде?

1 Ответ

0 голосов
/ 28 мая 2020

help_command в YAML загружается как строка. YAML не знает о символах, определенных в файле Python, куда он загружается, и в любом случае не будет отображать строки в символы.

Конечно, вы можете сделать

def handle_command(self, command, parameters, message):
    eval(self.commands.get(command).get('action'))(parameters, message)

Be однако осведомлен о последствиях для безопасности eval. Вы никогда не должны запускать это, если YAML поступает из ненадежного источника, он может делать что угодно.

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