Как можно осуществить динамический вызов функций в Python?

Как можно динамически вызывать функцию из директории actions на основе строки? 

У меня есть проект Django, в котором есть директория actions. Внутри нее могут быть другие директории произвольной вложенности, а в каждой из них расположены файлы .py с функциями или классами. Я хочу иметь возможность вызывать функции из этих файлов на основе строки. Как это можно реализовать? 

Обратите внимание, что каждый файл .py содержит только одну функцию или один класс, а все остальное импортируется из директории business layer или других директорий. Я хочу использовать эту возможность для динамической загрузки нужных обработчиков в зависимости от запросов пользователей. В таблице, содержащей эти обработчики, указаны их названия методов, классов или файлов.
  • 27 сентября 2023 г. 19:37
Ответы на вопрос 2
В Python для динамического вызова функций можно использовать функцию `getattr()`. 

Чтобы динамически вызывать функцию из директории actions на основе строки, можно выполнить следующие шаги:

1. Получить список всех файлов в директории actions и ее поддиректориях с помощью модуля `os`:

```python
import os

directory = 'actions'

# Получаем список всех файлов в директории actions и поддиректориях
file_list = []
for root, dirs, files in os.walk(directory):
    for file in files:
        file_list.append(os.path.join(root, file))
```

2. Используйте функцию `importlib` для импорта модулей и получения объектов функций или классов по имени модуля:

```python
import importlib

# Проходим по списку файлов и импортируем модули
modules = []
for file in file_list:
    module_name = os.path.splitext(os.path.basename(file))[0]
    module = importlib.import_module(f'actions.{module_name}')
    modules.append(module)
```

3. Выполняйте вызовы функций на основе строки, используя функцию `getattr()`:

```python
# Если у вас есть строковое название функции, например "my_function", то можно вызвать ее следующим образом:
function_name = "my_function"

for module in modules:
    if hasattr(module, function_name):
        function = getattr(module, function_name)
        result = function()
        break
```

Таким образом, вы будете использовать `importlib` для импорта модулей, `hasattr()` для проверки наличия функции или класса в модуле и `getattr()` для получения самого объекта функции или класса по имени. Затем вы можете вызывать эту функцию или создавать экземпляр класса по полученному объекту.
importlib - это библиотека Python, которая позволяет динамически импортировать модули. 

Для импорта модуля, вы можете использовать следующий код: 

```python
import importlib

module = importlib.import_module(f'actions.{module_name}')
```

После этого вы можете работать с импортированным модулем. 

Однако, использование такого подхода может быть сигналом о том, что у вас есть проблемы с архитектурой вашего приложения.
Похожие вопросы