Source code for CADETProcess.dataStructure.cache
from typing import Any, Optional
from .dataStructure import Structure
from .parameter import Bool
__all__ = [
"CachedPropertiesMixin",
"cached_property_if_locked",
]
[docs]
class cached_property_if_locked(property):
"""
A property that caches its value if the instance is locked.
This property extends the built-in property to cache its value when the instance
is locked. The cached value is stored in the instance's `cached_properties` dictionary.
"""
def __get__(self, instance: Any, cls: Optional[type] = None) -> Any:
"""
Get the value of the property, using the cache if the instance is locked.
Parameters
----------
instance : Any
The instance from which to retrieve the property value.
cls : Optional[type], optional
The class of the instance, by default None.
Returns
-------
Any
The value of the property.
"""
if instance.lock:
try:
return instance.cached_properties[self.name]
except KeyError:
pass
value = super().__get__(instance, cls)
if instance.lock:
instance.cached_properties[self.name] = value
return value
@property
def name(self) -> str:
"""str: name of the property."""
return self.fget.__name__
[docs]
class CachedPropertiesMixin(Structure):
"""
Mixin class for caching properties in a structured object.
This class is designed to be used as a mixin in conjunction with other classes
inheriting from `Structure`. It provides functionality for caching properties and
managing a lock state to control the caching behavior.
Notes
-----
- To prevent the return of outdated state, the cache is cleared whenever the `lock`
state is changed.
"""
_lock = Bool(default=False)
def __init__(self, *args: Any, **kwargs: Any) -> None:
"""Initialize Cached Properties Mixin Object."""
super().__init__(*args, **kwargs)
self.cached_properties = {}
@property
def lock(self) -> bool:
"""bool: If True, properties are cached. False otherwise."""
return self._lock
@lock.setter
def lock(self, lock: bool) -> None:
self._lock = lock
self.cached_properties = {}