在Python中添加本地命名空间?

时间:2009-10-10 22:05:05

标签: python namespaces class methods

Python中是否有办法通过调用函数来添加到本地名称空间而不在本地显式分配变量?

例如以下内容(当然这不起作用,因为locals()返回本地名称空间的副本),其中print语句将打印为“1”。

def A():
  B(locals())
  print x

def B(d):
  d['x'] = 1

2 个答案:

答案 0 :(得分:4)

在Python 2.*中,您可以通过使用exec ''启动函数来禁用Python编译器对局部变量访问执行的常规优化;这将使功能变得非常慢(我刚刚发布,今天早些时候,一个答案显示本地变量优化如何轻松地将代码加速3或4倍),但它会使你想要的黑客工作。即,在Python 2中。*:

def A():
  exec ''
  B(locals())
  print x

def B(d):
  d['x'] = 1

A()

会根据您的意愿发出1

这个hack在Python 3.*中被禁用(其中exec只是一个函数,不再是语句,也不再是关键字) - 编译器现在无条件地执行局部变量优化,所以有不再有办法解决它并使这些黑客工作。

答案 1 :(得分:1)

依赖像exec ''这样的黑客似乎非常可怕。如果像这样与全局声明进行交流,它似乎有效:

>>> def outer():
...   global x
...   b()
...   print x
... 
>>> def b():
...   global x
...   x = 2
... 
>>> outer()
2

您可以为变量创建命名空间:

class Namespace(object):
    pass

def A():
  names = Namespace()
  B(names)
  print names.x

def B(d):
  d.x = 1

然后使用names.xgetattr(names, "x")来访问属性。