Моя проблема заключается в следующем: у меня есть классы 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
Итак, есть ли что-то подобное уже имеющееся или я должен начать реализовывать свои собственные? Во втором случае предложения приветствуются: -)