如何将变量插入动态加载的模块的名称空间?

时间:2019-10-24 00:45:39

标签: python python-3.x python-importlib

我正在尝试在运行时动态导入Python模块,但是我希望导入代码为正在导入的模块提供缺少的变量。

  • Python3 builtins模块可以实现我想要的行为,但是我不知道这是最佳实践还是最佳方式。

其次,我想将要导入的文件告诉导入代码需要提供哪些变量。我有2个潜在的解决方案:

  • 我可以只运行exec_module,捕获名称错误,解析出丢失的变量,将其添加到内置变量中,然后重新运行exec_module直到成功。
  • 否则,我正在考虑在file_to_import.py中提供一些注释,例如# VARIABLES var1 var2 var3,然后从文件中读取第一行(并解析此注释)在exec_module之前。

基本上我拥有的是

file_to_import.py:

# Potentially: VARIABLES my_inserted_variable
print(my_inserted_variable)

file_that_does_the_import.py

# `values` is some dictionary of values I could provide
complete, stored_attributes = False, set()
while not complete:
    try:
        spec.loader.exec_module(foo)
        complete = True
    except NameError as e:
        name = str(e).split("'")[1]
        if name not in values:
            raise e

        setattr(builtins, name, values.get(name))
        stored_attributes.add(name)

for k in stored_attributes:
    delattr(builtins, k)

只想知道builtins是否是完成将数据从导入代码传递到导入模块的最佳方法。

0 个答案:

没有答案