他の名前が再バインドされた場合に、グローバルまたはローカル スコープで名前を自動的に再バインドする方法は Python にはありません。ただし、いくつかの値を追跡できるクラスを作成し、呼び出した値を返すメンバー関数を持つことができるはずですA
。また、@Alok が指摘したように、プロパティ記述子を使用して、関数を暗黙的に呼び出してその値を返すメンバー名を作成できるため、関数を非表示にして名前をプレーンな古い名前のように扱うことができます。
class Trk(object):
"""Track some values and compute a function if any change"""
def __init__(self, name, fn, **objects_to_track):
def _trk_fn(self):
if any(self.__dict__[x] != self.original_objects[x] for x in self.original_objects):
self.value = self.saved_fn(self.__dict___)
# now that self.value is updated, also update self.original_objects
for x in self.original_objects:
self.original_objects[x] = self.__dict__[x]
return self.value
self.original_objects = objects_to_track # make reference copy
self.__dict__.update(objects_to_track)
self.name = name
self.saved_fn = fn
self.fn = self._trk_fn()
self.value = self.fn()
申し訳ありませんが、私は今とても疲れていて、この例を終えることができません. 私もそれをテストしませんでした。しかし、これは値を追跡する 1 つの方法を示しており、値が異なる場合は別のことを行います。次のように使用します。
# want to track x, y, z
trk = Trk(x, y, z)
trk.fn() # returns up-to-date value
trk.x = new_value
trk.fn() #detects that trk.x changed and computes new trk.value
上記が機能する場合は、プロパティ記述子を使用して名前をバインドし、名前から値を読み取ろうとすると呼び出されるようにすることができますself.fn()
編集:ああ、更新されたときself.value
に更新するself.original_objects
必要があることが重要です。そのためのコードを追加しました。
そして今から寝ます!