What's needed?
Replace the pattern in _data_pipeline to create objects only once and that lives forever by creating a decorator (or selecting an existent one) to lazily create attributes and cache them for the lifetime of the _data_pipeline.
Proposed solution
Assess the different suggestions in these comments
We tried @cached_property and @lazy, but @cached_property is really complex and uses a lock (although it is removed in Python 3.12) and both allow writing to the property, and we need them to be read-only.
Use cases
Simplify code and improve code readability when there are many lazy attributes like in _data_pipeline
Alternatives and workarounds
Write ad-hoc code to do the lazy initialization.
Additional context
Originally posted in frequenz-floss/frequenz-sdk-python#799 (comment)
What's needed?
Replace the pattern in
_data_pipelineto create objects only once and that lives forever by creating a decorator (or selecting an existent one) to lazily create attributes and cache them for the lifetime of the_data_pipeline.Proposed solution
Assess the different suggestions in these comments
We tried
@cached_propertyand@lazy, but@cached_propertyis really complex and uses a lock (although it is removed in Python 3.12) and both allow writing to the property, and we need them to be read-only.Use cases
Simplify code and improve code readability when there are many lazy attributes like in
_data_pipelineAlternatives and workarounds
Write ad-hoc code to do the lazy initialization.
Additional context
Originally posted in frequenz-floss/frequenz-sdk-python#799 (comment)