from __future__ import annotations def get_all_children(obj, visited=None): if visited is None: visited = set() children = [] children_attr = getattr(obj, "children", []) if "Mock" in type(children_attr).__name__ or not isinstance(children_attr, (list, tuple, set)): return [] for child in children_attr: if child not in visited: visited.add(child) children.append(child) children.extend(get_all_children(child, visited)) return list(set(children))