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") |
说明
但是要注意,分配声明为全局的函数变量只会注入模块名称空间。导入后不能全局使用这些变量:
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() |
是的,只需使用
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 |