我有一个extern模块,我想将“exec”表达式设置为全局(因为我需要将字符串作为变量名称传递)
所以,我有一个像
这样的功能def fct_in_extern_module():
exec 'A = 42' in globals()
return None
在我的主脚本中我有
import extern_module
extern_module.fct_in_extern_module()
因此,为什么我有
NameError: name 'A' is not defined
如果我这样做(在主脚本中)
def fct_in_main():
exec 'B = 42' in globals()
fct_in_main()
>>> B
42
任何想法如何在extern模块中将字符串'A'设置为变量名?
谢谢!
答案 0 :(得分:4)
globals()
表示“此模块”的全局字典。因此,您选择编码extern_module.py
的方式将不影响任何其他模块的全局字典。
一种解决方法:将其定义为:
def fct_in_extern_module(where):
exec 'A = 42' in where
并将其命名为:
extern_module.fct_in_extern_module(globals())
当然,像往常一样,exec
不是解决问题的最佳方法。更好:
def fct_in_extern_module(where):
where['A'] = 42
更快更清洁。
答案 1 :(得分:1)
globals()
始终返回调用它的模块的__dict__
。这是唯一合理的选择......考虑一下:
# qux.py
import foo
foo.bar()
# foo.py
import baz
def bar():
return baz.exec_stuff()
# baz.py
def exec_stuff():
exec 'A = 1' in globals()
全局是否应设置为qux.py
或foo.py
或baz.py
?以这种方式看待baz
是最显而易见的选择,也是python使用的选择。
现在我们想到了为什么你首先使用exec 的问题?通常,返回调用者所需的值是一个更好的主意。然后他们可以用它做他们想做的事情:
def fn_in_extern_module():
return 42
然后:
import extern
A = extern.fn_in_extern_module()