Плюсы и минусы использования exec для импорта определенного модуля?
Я хотел бы выяснить недостатки использования exec
для импорта. Один из файлов служит интерфейсом для реальных реализаций определенных функций в зависимости от выбранного проекта (фреймворк предназначен для работы над несколькими проектами).
Первый вариант использования выглядит следующим образом:
exec ("from API.%s.specific_API_%s import *" % (project, project))
Таким образом, мне не нужно ничего кодировать, кроме переменной project
который вводится в сам интерфейс-модуль.
Это другой способ:
if project == 'project_one':
from API.project_one.specific_API_project_one import *
elif project == 'project_two':
from API.project_two.specific_API_project_two import *
elif project == 'project_three':
from API.project_three.specific_API_project_three import *
Таким образом, я должен изменять этот интерфейсный файл каждый раз, когда добавляется новый проект для поддержки.
1 ответ
- Если вам нужен программный способ импорта модулей, пожалуйста, используйте
importlib
или же__import__
(для действительно конкретных случаев). Причины - не изобретайте велосипед, есть способ сделать то, что вы хотите безexec
, Если твойproject
переменная из внешнего мира,exec
это огромная проблема безопасности. - Импорт подстановочных знаков считается плохой практикой - после этого усложняется поддержка вашей кодовой базы.
Упрощенный пример проблем с exec
выполнив произвольный код:
module = 'request'
func = 'urlopen'
exec("from urllib.%s import %s" % (module, func))
func = 'urlopen; print("hello python")'
exec("from urllib.%s import %s" % (module, func))
да, ваш пример сложнее подделать, но проблема остается - давать произвольный код на python для выполнения является излишним (с потенциальным пробелом в безопасности), когда у вас есть инструмент, созданный именно для ваших целей - программный импорт модулей.