Плюсы и минусы использования 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 ответ

  1. Если вам нужен программный способ импорта модулей, пожалуйста, используйте importlib или же __import__ (для действительно конкретных случаев). Причины - не изобретайте велосипед, есть способ сделать то, что вы хотите без exec, Если твой project переменная из внешнего мира, exec это огромная проблема безопасности.
  2. Импорт подстановочных знаков считается плохой практикой - после этого усложняется поддержка вашей кодовой базы.

Упрощенный пример проблем с 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 для выполнения является излишним (с потенциальным пробелом в безопасности), когда у вас есть инструмент, созданный именно для ваших целей - программный импорт модулей.

Другие вопросы по тегам