diff --git a/gpiozero/devices.py b/gpiozero/devices.py index 64bc4aa..346c677 100644 --- a/gpiozero/devices.py +++ b/gpiozero/devices.py @@ -315,20 +315,26 @@ class CompositeDevice(Device): self._named = frozendict({}) self._namedtuple = None self._order = kwargs.pop('_order', None) - if self._order is None: - self._order = sorted(kwargs.keys()) - else: - for missing_name in set(kwargs.keys()) - set(self._order): - raise CompositeDeviceBadOrder('%s missing from _order' % missing_name) - self._order = tuple(self._order) - for name in set(self._order) & set(dir(self)): - raise CompositeDeviceBadName('%s is a reserved name' % name) - for dev in chain(args, kwargs.values()): - if not isinstance(dev, Device): - raise CompositeDeviceBadDevice("%s doesn't inherit from Device" % dev) - self._named = frozendict(kwargs) - self._namedtuple = namedtuple('%sValue' % self.__class__.__name__, chain( - ('device_%d' % i for i in range(len(args))), self._order)) + try: + if self._order is None: + self._order = sorted(kwargs.keys()) + else: + for missing_name in set(kwargs.keys()) - set(self._order): + raise CompositeDeviceBadOrder('%s missing from _order' % missing_name) + self._order = tuple(self._order) + for name in set(self._order) & set(dir(self)): + raise CompositeDeviceBadName('%s is a reserved name' % name) + for dev in chain(args, kwargs.values()): + if not isinstance(dev, Device): + raise CompositeDeviceBadDevice("%s doesn't inherit from Device" % dev) + self._named = frozendict(kwargs) + self._namedtuple = namedtuple('%sValue' % self.__class__.__name__, chain( + ('device_%d' % i for i in range(len(args))), self._order)) + except: + for dev in chain(args, kwargs.values()): + if isinstance(dev, Device): + dev.close() + raise self._all = args + tuple(kwargs[v] for v in self._order) super(CompositeDevice, self).__init__() @@ -376,6 +382,7 @@ class CompositeDevice(Device): if self._all: for device in self._all: device.close() + self._all = () @property def closed(self):