说我有一个简单的功能:
def myfunc():
a = 4.2
b = 5.5
... many similar variables ...
我只使用这个函数一次,我想知道什么是最简单的方法,使函数内的所有变量都可以访问我的主名称空间。
我是否必须为每个项目声明全局?或任何其他建议的方法?
感谢。
答案 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.a
和x.b
,而非姓名,例如a
和b
,这里是至关重要的想法:限定名称可以让你分隔名称空间并对它们进行正确处理,而名字则会使所有内容成为一大汤并且违反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函数返回的所有局部变量的字典动态更新。
这是非常危险的因为它会破坏全局命名空间中的所有内容,所以如果您已经有x
或y
变量,那么它们将被覆盖。正如我所说,我真的想不出有这么好的理由,所以在诉诸这种诡计之前一定要三思而后行!
答案 3 :(得分:0)
听起来你想做的事情并不自然,因为它不是你应该做的事情。
也许你真正想要的是创建一个类并在它的实例上设置所有这些东西。
class MyState(object):
def __init__(self):
self.a = 4.2
self.b = 5.5
... many similar variables ...
将状态存储在您创建的类的实例上通常非常倾向于改变全局状态。这种方法也不需要任何魔法。