Source code for allensdk.core.lazy_property.lazy_property
from typing import Callable, Iterable
[docs]class LazyProperty(object):
def __init__(self, api_method: Callable, wrappers: Iterable = tuple(),
settable: bool = False, *args, **kwargs):
self.api_method = api_method
self.wrappers = wrappers
self.settable = settable
self.args = args
self.kwargs = kwargs
self.value = None
def __get__(self, obj, objtype=None):
if obj is None:
return self
if self.value is None:
self.value = self.calculate()
return self.value
def __set__(self, obj, value):
if self.settable:
self.value = value
else:
raise AttributeError("Can't set a read-only attribute")
[docs] def calculate(self):
result = self.api_method(*self.args, **self.kwargs)
for wrapper in self.wrappers:
result = wrapper(result)
return result