我想动态声明一个函数,我想包装对全局变量的任何访问,或者定义哪些变量是自由的,并包装对自由变量的任何访问。在
我在玩这样的代码:
class D:
def __init__(self):
self.d = {}
def __getitem__(self, k):
print "D get", k
return self.d[k]
def __setitem__(self, k, v):
print "D set", k, v
self.d[k] = v
def __getattr__(self, k):
print "D attr", k
raise AttributeError
globalsDict = D()
src = "def foo(): print x"
compiled = compile(src, "<foo>", "exec")
exec compiled in {}, globalsDict
f = globalsDict["foo"]
print(f)
f()
这将产生输出:
^{pr2}$我想要的是用类似dict的包装器D
捕捉对x
的访问。我怎么能做到呢?在
我不想预先定义所有全局变量(在本例中是x
),因为我希望能够延迟地加载它们。在
试试这个
您需要的是对象代理。在
下面是一个支持调用前和调用后挂钩的对象代理的方法:
http://code.activestate.com/recipes/366254-generic-proxy-object-with-beforeafter-method-hooks/
创建一个子类,直到第一次调用
_pre
钩子时才实际加载对象。任何访问对象的操作都会导致加载实际对象,所有调用都将显示为由实际对象直接处理。在相关问题 更多 >
编程相关推荐