Ленивый поток данных (типа электронной таблицы) свойств с зависимостями в Python

Моя проблема заключается в следующем: У меня есть несколько классов 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

Итак, есть ли уже что-то подобное или мне следует начать реализовывать свое собственное? Во втором случае предложения приветствуются :-)

13
задан unutbu 2 December 2011 в 22:05
поделиться