def __get__(self, instance, cls=None): if instance is None: owner = cls else: owner = instance key = id(owner) try: return self._instance_signals[key] except KeyError: pass parent = None signature = self.signature if instance is None: extra_arg = inspect.Parameter( name='sender', kind=inspect.Parameter.KEYWORD_ONLY, default=None) def _params_gen(): existing = iter(signature.parameters.values()) for param in existing: if param.kind in (inspect.Parameter.KEYWORD_ONLY, inspect.Parameter.VAR_KEYWORD): yield extra_arg yield param break else: yield param else: yield extra_arg yield from existing signature = signature.replace(parameters=list(_params_gen())) else: if cls: parent = self.__get__(None, cls) finalize(owner, self._instance_signals.pop, key, None) new_signal = type(self)(self.name, doc=self.__doc__, signature=signature, _owner=owner) if parent: new_signal.connect(parent, arg_adapter=_sender_arg_adapter(instance)) self._instance_signals[key] = new_signal return new_signal
def __set__(self, instance, value): exp = coerce(value, size=self._size) if id(instance) not in self._instance_expressions: finalize(instance, self._instance_expressions.pop, id(instance), None) self._instance_expressions[id(instance)] = simplify(exp)