代码之家  ›  专栏  ›  技术社区  ›  Gökhan Sever

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

  •  3
  • Gökhan Sever  · 技术社区  · 16 年前

    假设我有一个简单的函数:

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

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

    我必须为每个项目声明全局性吗?或者其他建议的方法?

    谢谢。

    4 回复  |  直到 16 年前
        1
  •  9
  •   Alex Martelli    16 年前

    在我有偏见的观点中,最好的方法是将字典包装成一个好的对象,其中“变量”作为属性访问——我命名的模式 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.a 和 x.b ,而不是 巴伦斯夫人 如 a 和 b ,这是这里的关键思想:限定名可以让您分离名称空间并正确对待它们,而barenames则会使所有内容都成为一大汤,违反python的禅;-)。当然,也不必使用未包装的口述稿 x['a'], x['b'] 访问!-)

        2
  •  5
  •   Ignacio Vazquez-Abrams    16 年前

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

    consts.py :

    foo = 42
    bar = 'quux'
    

    main.py :

    import consts
    
    print consts.foo
    print consts.bar[::-1]
    
        3
  •  1
  •   Eli Courtwright    16 年前

    我想不出有什么好理由这么做,但如果你真的想找个奇怪的理由:

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

    这样做是因为 globals 函数返回模块命名空间中全局变量的字典,您可以使用 locals 功能。

    这很危险 因为它会破坏全局命名空间中的所有内容,所以如果您已经有了 x 或 y 变量,则它们将被覆盖。正如我所说,我真的想不出一个好的理由去做这些,所以在诉诸这种诡计之前一定要三思而后行!

        4
  •  0
  •   Mike Graham    16 年前

    听起来你想做的事情不是很自然,因为这不是你通常应该做的事情。

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

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

    在您创建的类的实例上存储状态通常比更改全局状态更为可取。这种方法也不需要任何魔法。