Моя проблема заключается в следующем: У меня есть несколько классов python, которые имеют свойства, производные от других свойств; и они должны быть кэшированы после вычисления, и кэшированные результаты должны быть аннулированы каждый раз, когда базовые свойства изменяются.
Я мог бы сделать это вручную, но это кажется довольно сложным для поддержки, если количество свойств растет. Поэтому я хотел бы иметь что-то вроде Makefile правил внутри моих объектов для автоматического отслеживания того, что должно быть пересчитано.
Желаемый синтаксис и поведение должны быть примерно такими:
# this does dirty magic, like generating the reverse dependency graph,
# and preparing the setters that invalidate the cached values
@dataflow_class
class Test(object):
def calc_a(self):
return self.b + self.c
def calc_c(self):
return self.d * 2
a = managed_property(calculate=calc_a, depends_on=('b', 'c'))
b = managed_property(default=0)
c = managed_property(calculate=calc_c, depends_on=('d',))
d = managed_property(default=0)
t = Test()
print t.a
# a has not been initialized, so it calls calc_a
# gets b value
# c has not been initialized, so it calls calc_c
# c value is calculated and stored in t.__c
# a value is calculated and stored in t.__a
t.b = 1
# invalidates the calculated value stored in self.__a
print t.a
# a has been invalidated, so it calls calc_a
# gets b value
# gets c value, from t.__c
# a value is calculated and stored in t.__a
print t.a
# gets value from t.__a
t.d = 2
# invalidates the calculated values stored in t.__a and t.__c
Итак, есть ли уже что-то подобное или мне следует начать реализовывать свое собственное? Во втором случае предложения приветствуются :-)