代码之家  ›  专栏  ›  技术社区  ›  xenoid

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

  •  3
  • xenoid  · 技术社区  · 7 年前

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

    我编写了一个脚本,该脚本要求某些模块在某些系统(如 requests )脚本代码假定 import 已经完成(它使用 requests.get )

    如果我使用上面链接中的代码导入 请求 我必须使用:

    requests=importlib.import_module('requests')
    

    但这会导致大量的代码重复,因为我有几个模块。我不能在循环中使用它,因为变量名必须随导入的模块而更改。

    我发现我可以使用:

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

    一切都发生了,就好像我经常做一样 进口 s。 (当然,真正的代码捕获异常…)。

    所以问题是这有多有效/有多危险?太好了,不是真的吗?(python 2.7,如果有区别的话)

    1 回复  |  直到 7 年前
        1
  •  2
  •   Serge Ballesta    7 年前

    它是明确无效的。python 2.7.15的文档提到 locals() 功能:

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

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

    如果您真的需要这样的东西,您可以使用本地地图,依赖 sys.modules 地图更新人 import_module 或更新 globals() 地图。无论如何,一旦加载模块,它就存在(通过 sys.module 映射)对于整个程序,因此将其引用存储在本地符号表中并没有真正意义。

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

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