我想找出使用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 *
这样,每次添加新项目以支持它时,我都必须更改此接口文件。
答案 0 :(得分:2)
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任意代码执行是过大的(有潜在的安全漏洞)。