-3

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

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

有什么快速/可靠的方法吗?

更新:正如所有答案所述,您可以使用像字典这样的类实例,没有任何限制,foo.bar = 123。您不能将此表示法与字典一起使用(就像您可以在 Lua 中使用表格一样),这会导致我认为根本没有办法。谢谢你的帮助。

4

3 回答 3

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
于 2012-04-25T14:32:40.067 回答
0

如果您在全局命名空间中有名为g_var1and的变量g_var2(顺便说一句非常糟糕),您可以通过以下方式访问它们:

some_dict = {varname[2:]: var for varname, var in globals().iteritems() if varname.startswith('g_')}

您将获得一个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_全局变量为前缀,在全局命名空间中使用一个字典并从那里或你自己的类中访问它们。

祝你好运。

于 2012-04-25T14:39:59.653 回答
0

您可以使用这个“python 类的东西”来实现一个包含所有全局变量的对象。请注意,我认为这通常不是一个好方法,但它非常接近您打算做的事情。

在脚本的开头附近,定义一个类MyGlobals并获取它的一个实例:

class MyGlobals(object):
    pass
g = MyGlobals()

g您可以在脚本中的任何位置访问该对象,如下所示:

g.foo = "foo"
print g.foo

但正如评论中所说,尽量避免使用全局变量,看看是否可以更多地使用 OOP。

于 2012-04-25T16:03:37.387 回答