显式地向locals()添加内容有多糟糕?

2024-04-19 09:21:39 发布

您现在位置: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。 (当然,真正的代码捕获异常……)。你知道吗

所以问题是这有多有效/风险?太好了,是真是假?(Python2.7,如果有区别的话)


Tags: 模块代码import脚本forgethere链接
1条回答
网友
1楼 · 发布于 2024-04-19 09:21:39

这显然是无效的。python2.7.15的Doc提到locals()函数:

The contents of this dictionary should not be modified; changes may not affect the values of local and free variables used by the interpreter.

locals()是程序了解函数块中变量列表的一种方法。它不是一种创建局部变量的方法。你知道吗

如果您真的需要这样的东西,您可以使用本地映射、依赖由import_module更新的sys.modules映射,或者更新globals()映射。不管怎样,一旦加载了模块,它就存在于整个程序中(通过sys.module映射),因此将其引用存储在本地符号表中是没有意义的。你知道吗

因此,如果您真的需要导入动态构建的模块列表,我会:

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

相关问题 更多 >