使所有变量可访问命名空间

时间:2010-04-09 21:08:00

标签: python

说我有一个简单的功能:

def myfunc():
    a = 4.2
    b = 5.5
    ... many similar variables ...

我只使用这个函数一次,我想知道什么是最简单的方法,使函数内的所有变量都可以访问我的主名称空间。

我是否必须为每个项目声明全局?或任何其他建议的方法?

感谢。

4 个答案:

答案 0 :(得分:9)

最好的方式,在我的偏见中,是将字典包装成一个很好的对象,其中“变量”作为属性被访问 - 我在多年前介绍它时命名为Bunch的模式,以及禅宗Python中最后一项的一个很好的例子(如果你不知道那是什么,import this在翻译交互式提示中)。就是......:

class Bunch(object):
    def __init__(self, d=None):
        if d is not None: self.__dict__.update(d)

def myfunc():
    a = 4.2
    b = 5.5
    ...
    return Bunch(locals())

x = myfunc()

print x.a, x.b

使用限定名称,例如x.ax.b,而非姓名,例如ab,这里是至关重要的想法:限定名称可以让你分隔名称空间并对它们进行正确处理,而名字则会使所有内容成为一大汤并且违反Python的禅宗;-)。当然,没有必要使用未打包的字典和难看的x['a'], x['b']访问! - )

答案 1 :(得分:5)

如果你想要的是你的常量分离,那么把它们放在另一个模块中:

consts.py

foo = 42
bar = 'quux'

main.py

import consts

print consts.foo
print consts.bar[::-1]

答案 2 :(得分:1)

我想不出有什么好理由这样做,但如果你真的想要出于某种奇怪的原因:

def myfunc():
    x = 5.6
    y = 7.3
    # many other variables
    globals().update( locals() )

这是有效的,因为globals函数返回模块命名空间中全局变量的字典,您可以使用locals函数返回的所有局部变量的字典动态更新。

这是非常危险的因为它会破坏全局命名空间中的所有内容,所以如果您已经有xy变量,那么它们将被覆盖。正如我所说,我真的想不出有这么好的理由,所以在诉诸这种诡计之前一定要三思而后行!

答案 3 :(得分:0)

听起来你想做的事情并不自然,因为它不是你应该做的事情。

也许你真正想要的是创建一个类并在它的实例上设置所有这些东西。

class MyState(object):
    def __init__(self):
        self.a = 4.2
        self.b = 5.5
        ... many similar variables ...

将状态存储在您创建的类的实例上通常非常倾向于改变全局状态。这种方法也不需要任何魔法。