From 12cbd5ae09652e4992ab60c122f7f105e2c0b5eb Mon Sep 17 00:00:00 2001 From: Dave Jones Date: Sun, 25 Jun 2017 21:17:55 +0100 Subject: [PATCH] First stab at correcting object lifetime issue This is a minimal change which re-orders some bits of CompositeDevice's constructor to ensure that all exceptions get raised *before* we store a reference to the contained devices. Hopefully this'll be enough to sort out 2.x but I'm not sure it will be for pypy (might still require an explicit close there). --- gpiozero/devices.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/gpiozero/devices.py b/gpiozero/devices.py index bec651b..64bc4aa 100644 --- a/gpiozero/devices.py +++ b/gpiozero/devices.py @@ -321,16 +321,16 @@ class CompositeDevice(Device): for missing_name in set(kwargs.keys()) - set(self._order): raise CompositeDeviceBadOrder('%s missing from _order' % missing_name) self._order = tuple(self._order) - super(CompositeDevice, self).__init__() for name in set(self._order) & set(dir(self)): raise CompositeDeviceBadName('%s is a reserved name' % name) - self._all = args + tuple(kwargs[v] for v in self._order) - for dev in self._all: + 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)) + self._all = args + tuple(kwargs[v] for v in self._order) + super(CompositeDevice, self).__init__() def __getattr__(self, name): # if _named doesn't exist yet, pretend it's an empty dict