Задать вопрос
razrab228
@razrab228
зачем тебе знать это?

Как вызвать функцию, название которой записано в переменной?

Здравствуйте! Есть программа, которая просит название команды у пользователя, потом просто вызывает эту функцию:
def test():
     print("test")
func_name = input("Введите название функции: ")
func_name()

и допустим, пользователь вводит "test". И вроде бы, должна вызваться функция, но нет, ошибка:
str object is not callable
как можно решить данную проблему?
  • Вопрос задан
  • 150 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
Vindicar
@Vindicar
RTFM!
Правильное решение - иметь словарь функций.
funcs = {
    'test': test
}

cmd = input('Введите команду: ')
func = funcs.get(cmd, None)
if func is None:
    print(f'неизвеcтная команда {cmd}')
else:
    try:
        result = func()
    except Exception as err:
        print("Ошибка:", err)
    else:
        print("Результат:", result)
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Maksim_64
@Maksim_64
Data Analyst
eval(func_name)()
Ответ написан
Комментировать
xenon
@xenon
Too drunk to fsck
def x():
    print("x called")
fname="x"
globals()[fname]()


Ответ со словарем (выше) хороший. А еще есть встроенный словарь символов, который выдает globals().
И eval() - тоже вариант. Но если fname у вас идет из ненадежного источника (пользователя) - то это опасно (через globals() - тоже опасно). Например:

globals()['os'].system("clear")
Вызовет clear, а может вызвать и rm -rf / .

Если нужен безопасный eval - советую посмотреть на evalidate (disclaimer: этой мой пакет), и там по ссылкам еще альтернативы есть - asteval и simleeval. Через них можно (если аккуратно) сделать безопасный eval и проверить его популярным джейлбрейками (в evalidate они есть, и есть в тестах к нему).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы