我希望能够拦截函数中的变量赋值并执行自定义代码。我曾尝试创建一个自定义字典如下:如何覆盖__setitem__函数的全局字典?
class userdict(dict):
def __setitem__(self, key, value):
print 'run my code'
dict.__setitem__(self, key, value)
如果我用这个作为全球字典EXEC代码,然后我的自定义代码将在每个变量赋值运行。例如: -
UserDict = userdict()
exec 'x = 1' in UserDict
#outputs 'run my code'
但是,如果我的代码是一个函数里面,这是行不通的:
code = """
def foo():
global x
x = 1
"""
exec code in UserDict
UserDict['foo']()
在这种情况下,“X”分配,但我的自定义代码不能运行。我认为在一个函数内,全局字典正在被修改,而不用调用setitem。它是否正确?有没有办法拦截函数中的变量赋值并执行自定义代码?
我想这样做是为了将函数中可用的某些对象与程序中的其他对象同步。换句话说,当某个变量的赋值出现在函数内部时,该变化应该传播到我的程序中的其他变量。
这听起来很邪恶。 – jdi
你试图重写分配给全局变量时会发生什么,或者你还想在分配给局部变量时挂钩吗?两者都不是一个好主意,但前者可能有一些脆弱的,偷偷摸摸的黑客攻击。后者可能不可能。 – BrenBarn
你不能用你自己的障碍替换全局模块字典,并期望它可以工作。实际上应该发生的是这些函数应该发出某种信号或回调以允许其他数据结构进行响应。它不应该是一个黑盒子的情况,变量只是随机改变你。 – jdi