在python中更改全局变量的存储

时间:2012-04-25 14:23:52

标签: python globals

我想在python脚本中更改所有全局变量的存储空间,就好像我可以编写use_this_dict_for_globals(some_dict)一样。

它们都以“g_”为前缀,所以如果我可以用“some_dict”替换“g_”。要改变所有这些变量访问,这也会起作用。我实际上更喜欢这种方式,但是在Python中,我要么需要使用变量访问,比如foo ['bar']而不是foo.bar,或者我需要一些我一无所知的python类东西(?)。

有没有快速/可靠的方法呢?

更新:正如所有答案都说明的那样,你可以使用像字典这样的类实例,没有任何限制,foo.bar = 123.你不能在字典中使用这种表示法(就像你一样)可以在Lua用表格做,这让我觉得根本就没有办法。谢谢你的帮助。

3 个答案:

答案 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_var1g_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。