我想在python脚本中更改所有全局变量的存储空间,就好像我可以编写use_this_dict_for_globals(some_dict)一样。
它们都以“g_”为前缀,所以如果我可以用“some_dict”替换“g_”。要改变所有这些变量访问,这也会起作用。我实际上更喜欢这种方式,但是在Python中,我要么需要使用变量访问,比如foo ['bar']而不是foo.bar,或者我需要一些我一无所知的python类东西(?)。
有没有快速/可靠的方法呢?
更新:正如所有答案都说明的那样,你可以使用像字典这样的类实例,没有任何限制,foo.bar = 123.你不能在字典中使用这种表示法(就像你一样)可以在Lua用表格做,这让我觉得根本就没有办法。谢谢你的帮助。
答案 0 :(得分:0)
我会将所有内容分解为模块,并远离全球化的事物。
让一个模块具有所有全局变量,然后将其实例传递给需要它的其他模块。
class doSomeThing(object):
def __init__(self, config):
self.config = config
def some_func(self):
# something
pass
class Global_Config(object):
def __init__(self, params):
# load global information
if __name__ == "__main__":
# construct the config
config = Global_Config(some params)
one = doSomething(config)
two = doSomethingTwo(config)
# do stuff with do some work with one and two and config
答案 1 :(得分:0)
如果在名为g_var1
和g_var2
的全局命名空间中有变量(顺便说一下非常糟糕),您可以使用以下命令访问它们:
some_dict = {varname[2:]: var for varname, var in globals().iteritems() if varname.startswith('g_')}
您将获得一个dict some_dict
,其中包含以g_
开头的所有全局变量。您可以使用some_dict['var1']
。
但除非你绝对必须,否则不要这样做。使用类和模块/包。 简单的例子:
class SomeClass(object):
def __init__(self):
self.var1 = 'whatever'
self.var2 = 'whatever also'
c = SomeClass()
print c.var1, c.var2
有关更多信息,请阅读有关类和模块(import some_module
及类似内容)的内容。
<强>结论:强>
不要在g_
前缀全局变量,在全局命名空间中使用一个字典,并从那里或您自己的类访问这些字典。
答案 2 :(得分:0)
您可以使用此“python类stuff”来实现一个包含所有全局变量的对象。请注意,我认为这不是一般的好方法,但它非常接近您的意图。
在脚本开头附近,定义一个类MyGlobals
并获取它的实例:
class MyGlobals(object):
pass
g = MyGlobals()
您可以在脚本中的任何位置访问对象g
,如下所示:
g.foo = "foo"
print g.foo
但正如评论中所述,尽量避免使用全局变量,看看是否可以更多地使用OOP。