关于python:从函数内将变量插入全局命名空间?

Insert variable into global namespace from within a function?

本问题已经有最佳答案,请猛点这里访问。

是否可以编写将对象插入全局命名空间并将其绑定到变量的函数?例如。:

1
2
3
4
5
6
7
8
>>> 'var' in dir()
False
>>> def insert_into_global_namespace():
...        var ="an object"
...        inject var
>>> insert_into_global_namespace()
>>> var
"an object"

它就像

1
globals()['var'] ="an object"

和/或

1
2
3
4
def insert_into_namespace(name, value, name_space=globals()):
    name_space[name] = value

insert_into_namespace("var","an object")

说明globals是内置关键字,即'globals' in __builtins__.__dict__的计算结果为True


但是要注意,分配声明为全局的函数变量只会注入模块名称空间。导入后不能全局使用这些变量:

1
2
3
from that_module import call_that_function
call_that_function()
print(use_var_declared_global)

你得到

1
NameError: global name 'use_var_declared_global' is not defined

您必须再次执行导入操作才能同时导入那些新的"模块全局"。内置模块是"真正的全局"尽管:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class global_injector:
    '''Inject into the *real global namespace*, i.e."builtins" namespace or"__builtin__" for python2.
    Assigning to variables declared global in a function, injects them only into the module's global namespace.
    >>> Global= sys.modules['__builtin__'].__dict__
    >>> #would need
    >>> Global['aname'] = 'avalue'
    >>> #With
    >>> Global = global_injector()
    >>> #one can do
    >>> Global.bname = 'bvalue'
    >>> #reading from it is simply
    >>> bname
    bvalue

    '''

    def __init__(self):
        try:
            self.__dict__['builtin'] = sys.modules['__builtin__'].__dict__
        except KeyError:
            self.__dict__['builtin'] = sys.modules['builtins'].__dict__
    def __setattr__(self,name,value):
        self.builtin[name] = value
Global = global_injector()


是的,只需使用global语句。

1
2
3
def func():
    global var
    var ="stuff"


罗兰·普泰尔的回答更简洁的版本是:

1
2
3
4
import builtins

def insert_into_global_namespace():
    builtins.var = 'an object'

我认为没有人解释过如何创建和设置一个全局变量,它的名称本身就是一个变量的值。

这是一个我不喜欢的答案,但至少它起作用[1],通常是[2]。

我希望有人能给我一个更好的方法。我发现了几个用例,实际上我在使用这个丑陋的答案:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
########################################
def insert_into_global_namespace(
    new_global_name,
    new_global_value = None,
):
    executable_string ="""
global %s
%s = %r
"""
% (
        new_global_name,
        new_global_name, new_global_value,
    )
    exec executable_string  ## suboptimal!

if __name__ == '__main__':
    ## create global variable foo with value 'bar':
    insert_into_global_namespace(
        'foo',
        'bar',
    )
    print globals()[ 'foo']
########################################
  • 应避免使用python exec,原因有很多。

  • 注意:"exec"行("unqualified exec")中缺少"in"关键字。


  • 1
    2
    3
    4
    5
    6
    7
    8
    var =""

    def insert_global():    
        global var
        var ="saher"

    insert_global()
    print var