从extern模块执行一个全局变量

时间:2015-08-07 22:42:24

标签: python string exec global python-module

我有一个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'设置为变量名?

谢谢!

2 个答案:

答案 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.pyfoo.pybaz.py?以这种方式看待baz显而易见的选择,也是python使用的选择。

现在我们想到了为什么你首先使用exec 的问题?通常,返回调用者所需的值是一个更好的主意。然后他们可以用它做他们想做的事情:

def fn_in_extern_module():
    return 42

然后:

import extern
A = extern.fn_in_extern_module()