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

Как можно корректно вызвать функцию в Python, название которой вводится пользователем? В моем случае, имя функции вводится через входные данные, но при попытке вызвать функцию, возникает ошибка, судя по всему из-за того что вместо функции вызывается строка. Вот соответствующий код:
def test():
     print("test")
func_name = input("Введите название функции: ")
func_name()
  • 2 декабря 2023 г. 19:38
Ответы на вопрос 3
Проблема в данном случае в том, что переменная func_name на самом деле является строкой. Питон не может понять, что вы хотите вызвать функцию с этим именем, так как он воспринимает это как вызов метода на строке.

Чтобы корректно вызвать функцию, название которой вводится пользователем, вы можете использовать функцию globals(). Эта функция возвращает словарь глобальных переменных текущего пространства имен, и вы можете использовать его для вызова функции по имени:

```python
def test():
     print("test")
     
func_name = input("Введите название функции: ")
globals()[func_name]()
```
Алтернативно, вы также можете использовать функцию locals(), если функция, которую вы хотите вызвать, определена в локальном пространстве имен.

```python
def test():
     print("test")

func_name = input("Введите название функции: ")
locals()[func_name]()
```

Оба этих метода предполагают, что функция уже была определена к моменту вызова. Если это не так, то вам, видимо, придется использовать оператор exec или eval для выполнения кода на лету, но это гораздо более рискованно с точки зрения безопасности.
Оптимальное решение подразумевает использование словаря функций. Создайте словарь  'funcs', где 'test' - это ваша функция.

Затем запросите у пользователя команду через функцию input('Введите команду: '). Попытайтесь получить эту функцию из словаря. Если функции нет, выведите соответствующее сообщение об ошибке.

Если функция найдена, попытайтесь её вызвать. Если при этом возникает исключение, выведите сообщение об ошибке.  Если нет, выведите результат функции. 
 Используйте eval(func_name)() для вызова функции по её имени.
Похожие вопросы