在给定变量名称为字符串的模块内部修改 __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 的子字符串是 main 中的变量的名称,我需要对其进行修改,以便修改在 main 中可见。
如何在不将变量实际传递给函数的情况下做到这一点? (字符串是类似 SQL 的查询,子字符串是表名)。
目前,我只发现了一种非常丑陋的方法,涉及修改 builtin 变量……
我已经尝试了很多涉及exec
的东西,但没有任何东西能够改变 main 空间名中的变量。
我查看了不同的讨论,但无法修复它。
【问题讨论】:
为什么不将变量传递给模块 - 然后让它们模块返回修改后的值? 如果您有一个模块“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的主要内容,如果未能解决你的问题,请参考以下文章