将事物显式添加到locals()有多糟?

时间:2018-07-24 12:49:30

标签: python

我正在尝试如here所述动态加载模块。

我编写了一个脚本,该脚本要求某些模块在某些系统上默认情况下可能未安装(例如requests)。脚本代码假定已完成常规import(它使用requests.get)。

如果我使用上面链接中的代码,要导入requests,我将必须使用:

requests=importlib.import_module('requests')

但是由于我有几个模块,所以这导致很多代码重复。我不能在循环中使用它,因为变量名称必须随导入的模块一起更改。

我发现我可以使用:

for m in list_of_modules:
    locals()[m]=importlib.import_module(m)

一切都会发生,就好像我做了常规的import一样。 (当然,真正的代码会捕获异常...)。

所以问题是,这有多有效?太真实了吗? (如果有,Python 2.7会有所作为)

1 个答案:

答案 0 :(得分:2)

它显然是无效的。 Python 2.7.15的文档提到了locals()函数:

  

此字典的内容不应修改;更改可能不会影响解释器使用的局部变量和自由变量的值。

locals()是程序了解功能块中变量列表的一种方式。这不是创建局部变量的方法。

如果您确实需要类似的内容,则可以使用本地地图,依靠由sys.modules更新的import_module地图,也可以更新globals()地图。无论如何,一旦模块被加载,整个程序就存在(通过sys.module映射),因此将其引用存储在本地符号表中并没有任何意义。

因此,如果您确实需要导入动态构建的模块列表,则可以这样做:

for m in list_of_modules:
    globals()[m]=importlib.import_module(m)