Skip to content

Implement decorator to create read-only lazy attributes #28

@daniel-zullo-frequenz

Description

@daniel-zullo-frequenz

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)

Metadata

Metadata

Assignees

No one assigned

    Labels

    priority:lowThis should be addressed only if there is nothing else on the tabletype:enhancementNew feature or enhancement visitble to users

    Type

    No type

    Projects

    Status

    To do

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions