mirror of
https://github.com/tiqi-group/pydase.git
synced 2025-06-07 05:50:41 +02:00
updates PropertyObserver to support descriptors returning observables
If a class attribute is a descriptor, get its value before checking if it is an Observable.
This commit is contained in:
parent
91a71ad004
commit
008e1262bb
@ -5,6 +5,7 @@ from typing import Any
|
|||||||
|
|
||||||
from pydase.observer_pattern.observable.observable import Observable
|
from pydase.observer_pattern.observable.observable import Observable
|
||||||
from pydase.observer_pattern.observer.observer import Observer
|
from pydase.observer_pattern.observer.observer import Observer
|
||||||
|
from pydase.utils.helpers import is_descriptor
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
@ -61,17 +62,27 @@ class PropertyObserver(Observer):
|
|||||||
self, obj: Observable, deps: dict[str, Any], prefix: str
|
self, obj: Observable, deps: dict[str, Any], prefix: str
|
||||||
) -> None:
|
) -> None:
|
||||||
for k, value in {**vars(type(obj)), **vars(obj)}.items():
|
for k, value in {**vars(type(obj)), **vars(obj)}.items():
|
||||||
|
actual_value = value
|
||||||
prefix = (
|
prefix = (
|
||||||
f"{prefix}." if prefix != "" and not prefix.endswith(".") else prefix
|
f"{prefix}." if prefix != "" and not prefix.endswith(".") else prefix
|
||||||
)
|
)
|
||||||
parent_path = f"{prefix}{k}"
|
parent_path = f"{prefix}{k}"
|
||||||
if isinstance(value, Observable):
|
|
||||||
|
# Get value from descriptor
|
||||||
|
if not isinstance(value, property) and is_descriptor(value):
|
||||||
|
actual_value = getattr(obj, k)
|
||||||
|
|
||||||
|
if isinstance(actual_value, Observable):
|
||||||
new_prefix = f"{parent_path}."
|
new_prefix = f"{parent_path}."
|
||||||
deps.update(
|
deps.update(
|
||||||
self._get_properties_and_their_dependencies(value, new_prefix)
|
self._get_properties_and_their_dependencies(
|
||||||
|
actual_value, new_prefix
|
||||||
|
)
|
||||||
)
|
)
|
||||||
elif isinstance(value, list | dict):
|
elif isinstance(value, list | dict):
|
||||||
self._process_collection_item_properties(value, deps, parent_path)
|
self._process_collection_item_properties(
|
||||||
|
actual_value, deps, parent_path
|
||||||
|
)
|
||||||
|
|
||||||
def _process_collection_item_properties(
|
def _process_collection_item_properties(
|
||||||
self,
|
self,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user