在给定变量名称为字符串的模块内部修改 __main__.variable

Posted

技术标签:

【中文标题】在给定变量名称为字符串的模块内部修改 __main__.variable【英文标题】:Modify a __main__.variable from inside a module given the name of the variable as string 【发布时间】:2020-06-13 15:14:00 【问题描述】:

我正在编写一个模块,其中包含一个函数 f(string)。 string 的子字符串是 ma​​in 中的变量的名称,我需要对其进行修改,以便修改在 ma​​in 中可见。

如何在不将变量实际传递给函数的情况下做到这一点? (字符串是类似 SQL 的查询,子字符串是表名)。

目前,我只发现了一种非常丑陋的方法,涉及修改 builtin 变量…… 我已经尝试了很多涉及exec 的东西,但没有任何东西能够改变 ma​​in 空间名中的变量。

我查看了不同的讨论,但无法修复它。

【问题讨论】:

为什么不将变量传递给模块 - 然后让它们模块返回修改后的值? 如果您有一个模块“a”,其中有一个名为“foo”的变量,那么“a.foo”就是该变量在“a”之外的名称。如果您在模块“b”中导入 a,那么您可以编写 a.foo = x。 “a”中任何随后访问 foo 的代码都将获得 x 的值。这几乎是可以想象的最糟糕的编程实践,这是不言而喻的。 1) 为什么模块依赖于脚本中的变量? 2)为什么你使用一个独立的变量而不是一个你可以用(子)字符串索引的字典? 你的函数可以做 sys.modules["__main__"].__dict__[variable_name] = new_value 。我不确定“将变量传递给函数”是什么意思。 我找到了一个解决方案,只是在模块内使用:exec("__main__."+substring+"= new_value")。感谢您的帮助。 【参考方案1】:

模块可通过sys.modules 获得。你可以在那里设置变量。

def set_module_var(module_name, variable_name, value):
    #sys.modules["__main__"].__dict__[name] = value
    setattr(sys.modules[module_name], variable_name, value)

def f(string):
    variable_name, value = do_some_magic(string)
    set_module_var('__main__', variable_name, value)

【讨论】:

以上是关于在给定变量名称为字符串的模块内部修改 __main__.variable的主要内容,如果未能解决你的问题,请参考以下文章

if __name__ =="__main__"

在 __main__.py 中使用模块自己的对象

Python中关于__main__变量的问题

Python学习日记使用if __name__ == "main"

如何修改模块中的变量和实例并在运行时在python中保存

Python基础