将变量从函数中插入全局命名空间



是否可以将对象添加到全局命名空间,例如使用globals()dir()

def insert_into_global_namespace(var_name, value):
    globals()[var_name] = value

insert_into_global_namespace('my_obj', 'an object')
print(f'my_obj = {my_obj}')

但这只适用于当前模块。

它就像一样简单

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

和/或

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

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

from that_module import call_that_function
call_that_function()
print(use_var_declared_global)

然后你得到

NameError: global name 'use_var_declared_global' is not defined

您必须再次进行导入,才能导入那些新的"模块全局"。不过,内置模块是"真正的全局":

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语句。

def func():
    global var
    var = "stuff"

Roland Puntaier答案的一个更简洁的版本是:

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

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

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

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

########################################
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']
########################################
  1. 由于许多原因,应该避免使用Python exec。

  2. 注意:注意"exec"行缺少"in"关键字("不合格的exec")。

相关内容

  • 没有找到相关文章

最新更新