From d9fe924fa5f248a29718f66dbdf43030f2aa4f9d Mon Sep 17 00:00:00 2001 From: Sven Augustin Date: Fri, 11 Dec 2020 14:02:53 +0100 Subject: [PATCH] detect recursive Device, warn and ignore --- slic/devices/device.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/slic/devices/device.py b/slic/devices/device.py index 8f382d1c..632e7ac9 100644 --- a/slic/devices/device.py +++ b/slic/devices/device.py @@ -1,3 +1,4 @@ +from warnings import warn from slic.core.adjustable import Adjustable from slic.utils.printing import printable_dict from .basedevice import BaseDevice @@ -32,18 +33,25 @@ def read_z_from_channel(chan): return None -def recursive_adjustables(dev, base_key=None): - base_key = base_key or [] +def recursive_adjustables(dev, base_keys=None, seen_devs=None): + base_keys = base_keys or [] + seen_devs = seen_devs or {} res = {} for key, item in dev.__dict__.items(): - combined_keys = base_key + [key] + combined_keys = base_keys + [key] + this_key = ".".join(combined_keys) if isinstance(item, Adjustable): - this_key = ".".join(combined_keys) res[this_key] = str(item) elif isinstance(item, Device): - deeper_res = recursive_adjustables(item, combined_keys) + item_id = id(item) + if item_id in seen_devs: + seen_key = seen_devs[item_id] + warn(f"Recursive Device: {this_key} == {seen_key}", stacklevel=2) + continue + seen_devs[item_id] = this_key + deeper_res = recursive_adjustables(item, combined_keys, seen_devs) res.update(deeper_res) return res