我一直在玩Python中的拦截全局作业:
class MyDict(dict):
def __setitem__(self, k, v):
print "intercepted assignment to ", k
super(MyDict, self).__setitem__(self, k, v)
nsG = MyDict()
exec('a=10', nsG)
这会打印“截获的分配给”。凉!但是,这在函数内部不起作用:
def f():
# global a
a = 10
exec("f()", nsG)
在那里,a
的分配没有被拦截(因为默认情况下,函数中的赋值是该函数的本地分配:a
是f
的本地分配,因此nsG
是没有参与;如果我取消注释global a
中的f
语句,那么就像人们期望的那样拦截分配。
有没有办法拦截函数中的本地赋值?