関数内で変数の割り当てを傍受し、カスタム コードを実行できるようにしたいと考えています。次のようにカスタムdictを作成しようとしました:
class userdict(dict):
def __setitem__(self, key, value):
print 'run my code'
dict.__setitem__(self, key, value)
これをグローバル dict として使用してコードを実行すると、カスタム コードが変数の割り当てごとに実行されます。例えば:
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 を呼び出さずにグローバル dict が何らかの形で変更されていると仮定します。これは正しいです?関数内で変数の割り当てをインターセプトしてカスタム コードを実行する方法はありますか?
関数内で使用可能な特定のオブジェクトをプログラム内の他のオブジェクトと同期するために、これを実行したいと考えています。つまり、関数内で特定の変数への割り当てが発生すると、その変更はプログラム内の他の変数に伝播するはずです。