在 Python 函数中拦截本地赋值

intercept local assignment in python function

提问人:Oliver 提问时间:4/16/2014 更新时间:4/16/2014 访问量:389

问:

我一直在尝试在 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)

这将打印“截获的对 a 的分配”。凉!但是,这在函数中不起作用:

def f():
    # global a
    a = 10

exec("f()", nsG)

在那里,赋值不会被截获(因为默认情况下,函数中的赋值是该函数的本地赋值:是本地的,所以不涉及;如果我取消注释中的语句,那么赋值就会被截获,正如人们所期望的那样)。aafnsGglobal af

有没有办法拦截函数中的本地赋值?

python 变量赋值 assignment-operator

评论

1赞 PaulMcG 4/16/2014
不。Assignment 不是 Python 中的运算符。最接近的方法是使用您完成的技巧,并通过键“分配”到自定义对象中。然后你可以在里面做任何你想做的事情。__setitem____setitem__
0赞 shx2 4/16/2014
是否要拦截它并将其分配给用于全局变量的相同?这将以不可预测的方式改变你正在输入的代码的行为,因为你将全局变量和局部变量存储在同一个字典中。此外,在 python 中表现不同......你真的不能篡改当地人nsGexecglobalslocals

答: 暂无答案