Плюсы и минусы использования exec для импорта определенного модуля? - PullRequest
0 голосов
/ 12 февраля 2019

Я бы хотел выяснить недостатки использования 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 Ответ

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

...