diff --git a/ophyd/device.py b/ophyd/device.py index 0d9882a52..6c5b580e8 100644 --- a/ophyd/device.py +++ b/ophyd/device.py @@ -253,10 +253,12 @@ def create_component(self, instance): "Instantiate the object described by this Component for a Device" kwargs = self.kwargs.copy() kwargs.update( - name=f"{instance.name}_{self.attr}", + name=f"{instance.name}{instance._child_name_seperator}{self.attr}", kind=instance._component_kinds[self.attr], attr_name=self.attr, ) + if issubclass(self.cls, Device): + kwargs.setdefault("child_name_seperator", instance._child_name_seperator) for kw, val in list(kwargs.items()): kwargs[kw] = self.maybe_add_prefix(instance, kw, val) @@ -839,10 +841,11 @@ def __init__( read_attrs=None, configuration_attrs=None, parent=None, + child_name_seperator="_", **kwargs, ): self._destroyed = False - + self._child_name_seperator = child_name_seperator # Store EpicsSignal objects (only created once they are accessed) self._signals = {} diff --git a/ophyd/tests/test_device.py b/ophyd/tests/test_device.py index 926bbab53..a277c9d7a 100644 --- a/ophyd/tests/test_device.py +++ b/ophyd/tests/test_device.py @@ -969,3 +969,31 @@ class FakeTriggerableDevice(Device): d.trigger() assert d.strigger.get() == after + + +def test_child_seperator(): + class Test(Device): + a = Component(Signal) + b = Component(Signal) + + t = Test(name="bob") + assert t.a.name == "bob_a" + + t = Test(name="bob", child_name_seperator="-") + assert t.a.name == "bob-a" + + class Test2(Device): + c = Component(Signal) + d = Component(Signal) + t = Component(Test) + s = Component(Test, child_name_seperator="?") + + t2 = Test2(name="bob", child_name_seperator="!") + + assert t2.c.name == "bob!c" + assert t2.d.name == "bob!d" + + assert t2.t.a.name == "bob!t!a" + assert t2.t.b.name == "bob!t!b" + assert t2.s.a.name == "bob!s?a" + assert t2.s.b.name == "bob!s?b"