fixing once more the recursion issues

This commit is contained in:
2025-11-17 19:41:59 +01:00
parent 2c456d3a9a
commit f0fbcabf55
+37 -12
View File
@@ -43,41 +43,60 @@ class StatusCollection:
self._list = []
def get_list(self, selection=None, **kwargs):
ls = kwargs.get("ls", [])
rec_list_items = kwargs.get("rec_list_items", [])
ls = []
for witem in self._list:
item = witem()
if item is None:
continue
if item is self.parent:
continue
if item in ls:
continue
if selection is not None:
if selection not in self.selections.keys():
continue
item_name = item.alias.get_full_name(base=self.parent())
if item_name not in self.selections[selection].keys():
continue
recurse = self.selections[selection][item_name]["recurse"]
else:
recurse = True
ls.append(
item
) # important to get field in case no recursion is defined.
ls.append(item)
# important to get field in case no recursion is defined.
if item is self.parent():
recurse = False
if hasattr(item, f"{self.name}") and isinstance(
item.__dict__[self.name], self.__class__
):
if recurse:
# if hasattr(item, "recursing") and item.recursing:
# print(
# f"recursing detected loop at {item.alias.get_full_name()}"
# )
# item.recursing = True
for titem in item.__dict__[self.name].get_list(
selection=selection, ls=ls
selection=selection, ls=[]
):
if titem not in ls:
ls.append(titem)
else:
if item not in ls:
ls.append(item)
else:
if item not in ls:
ls.append(item)
return ls
def get_names(self, selection=None):
@@ -96,7 +115,7 @@ class StatusCollection:
self.selections[selection] = {}
obj_name = obj.alias.get_full_name(base=self.parent())
self.selections[selection][obj_name] = {"recurse": recursive}
if obj not in self._list:
if obj not in [tl() for tl in self._list]:
self._list.append(weakref.ref(obj))
def remove(self, obj, selection=None):
@@ -159,11 +178,19 @@ class Assembly:
is_setting=False,
is_display=True,
is_status=True,
recursive=None,
# recursive=None,
call_obj=True,
overwrite=False,
**kwargs,
):
"""This hidden method appends an object to the assembly. It can take either an object instance, or a class (in which case it will be called with the provided args and kwargs).
Parameters
----------
foo_obj_init : Adjustable, Detector, Assembly, class, callable
The object to append, or a class/callable to instantiate.
name : str, optional
The name of the object within the assembly. If None, the name attribute of the object will be used.
is_setting : bool or str "recursive", optional"""
if overwrite:
if name in self.__dict__:
@@ -192,8 +219,6 @@ class Assembly:
if is_setting:
if isinstance(is_setting, str):
recursive = is_setting.lower() == "recursive"
elif not (recursive is None):
recursive = recursive
else:
recursive = True
self.status_collection.append(
@@ -205,8 +230,6 @@ class Assembly:
if is_display:
if isinstance(is_display, str):
recursive = is_display.lower() == "recursive"
elif not (recursive is None):
recursive = recursive
else:
recursive = False
self.status_collection.append(
@@ -331,7 +354,9 @@ class Assembly:
sel_dict = {}
for selection_name in selections:
sel = self.status_collection.get_names(selection=selection_name)
sel_dict[selection_name] = {tname: status[tname] for tname in sel}
sel_dict[selection_name] = {
tname: status[tname] for tname in sel if tname in status.keys()
}
return {
# "settings": settings,