updates get_object_attr_from_path to support dictionaries

This commit is contained in:
Mose Müller 2024-04-23 14:21:30 +02:00
parent 564eeeb433
commit 8fd83fbd7d
2 changed files with 33 additions and 8 deletions

View File

@ -48,15 +48,12 @@ def get_object_attr_from_path(target_obj: Any, path: str) -> Any:
"""
path_list = path.split(".") if path != "" else []
for part in path_list:
attr, key = parse_keyed_attribute(part)
try:
# Try to split the part into attribute and index
attr, index_str = part.split("[", maxsplit=1)
index_str = index_str.replace("]", "")
index = int(index_str)
target_obj = getattr(target_obj, attr)[index]
except ValueError:
# No index, so just get the attribute
target_obj = getattr(target_obj, part)
if key is not None:
target_obj = getattr(target_obj, attr)[key]
else:
target_obj = getattr(target_obj, attr)
except AttributeError:
# The attribute doesn't exist
logger.debug("Attribute % does not exist in the object.", part)

View File

@ -1,7 +1,9 @@
from typing import Any
import pydase
import pytest
from pydase.utils.helpers import (
get_object_attr_from_path,
is_property_attribute,
parse_keyed_attribute,
)
@ -49,6 +51,32 @@ def test_parse_keyed_attributes(attr_name: str, expected: tuple[str, Any]) -> No
assert parse_keyed_attribute(attr_name) == expected
def test_get_object_attr_from_path() -> None:
class SubService(pydase.DataService):
name = "SubService"
some_int = 1
some_float = 1.0
class MyService(pydase.DataService):
def __init__(self) -> None:
super().__init__()
self.some_float = 1.0
self.subservice = SubService()
self.list_attr = [1.0, SubService()]
self.dict_attr = {"foo": SubService()}
service_instance = MyService()
for attr_name, obj in [
("some_float", service_instance.some_float),
("subservice", service_instance.subservice),
("list_attr[0]", service_instance.list_attr[0]),
("list_attr[1]", service_instance.list_attr[1]),
("dict_attr['foo']", service_instance.dict_attr["foo"]),
]:
assert get_object_attr_from_path(service_instance, attr_name) == obj
# def test_get_nested_dict_by_path() -> None:
# obj = {"2.1": "foo", 2.1: "bar"}
# serialized_object = {