def __set_name__(self, task_class: Type['DAQTask'], name: str) -> None: self.task_class = task_class self.name = name self.identifier = self.channel_name.format(**self.__dict__) identifier_set = setdefault_attr_from_factory(self.task_class, _identifier_set_key, set) if self.identifier in identifier_set: raise ValueError(f'channel {self.identifier} redeclared.') identifier_set.add(self.identifier) channel_map = setdefault_attr_from_factory(self.task_class, _channel_map_key, dict) self.task_ch_id = 0 if not channel_map else max(channel_map.keys()) + 1 channel_map[self.task_ch_id] = self
def add_self_to_map(owner, map_key: str, name: str, index: Optional[int], value) -> int: d = setdefault_attr_from_factory(owner, map_key, dict) if index is not None: if (index in d) or (d and (max(d.keys()) > index)): raise ValueError(f'cannot assign {name} to {index}') index = index elif d: index = max(d.keys()) + 1 else: index = 0 d[index] = value return index # type: ignore
def multiple_dispatch(f: Callable) -> Callable: """ the first func of name <name> to be decorated with this is registered as the default implementation any others are registered by non-bound parameter annotations, which must each be a type should not be used with keyword arguments raises TypeError on bad usage ex: class Blah: @multiple_dispatch def blah(self, *args): ... <- default implementation (annotations disregarded) @multiple_dispatch def blah(self, x: int y: list): ... <- specific implementation @multiple_dispatch def blah(self, x: int y: List[str]): ... <- fails at class declaration time """ return setdefault_attr_from_factory( multiple_dispatch, '__registry', dict ).setdefault((getattr(f, '__module__'), f.__qualname__), _MultiMethod()).register(f)
def __set_name__(self, owner: 'InstrumentHandler', name: str) -> None: setdefault_attr_from_factory(owner, _test_instruments_key, dict)[name] = self setattr(owner, name, self)
def __set_name__(self, owner, name): for message_type in self._message_types: setdefault_attr_from_factory(owner, _subscribed_methods_key, dict)[message_type] = self._f.__name__ self._name = name
def __set_name__(self, owner, name): self.owner = owner self.name = name setdefault_attr_from_factory(owner, _config_obj_dict_key, dict)[self.name] = self
def __set_name__(self, owner, name): for message_type in self._message_types: setdefault_attr_from_factory( owner, _subscribed_methods_key, lambda: defaultdict(dict))[ self._target][message_type] = self._f.__name__ self._name = name
def __set_name__(self, owner, name): setdefault_attr_from_factory(owner, _module_map_key, dict)[self.device_name] = self
def __set_name__(self, owner, name): setdefault_attr_from_factory(owner, self.registry_key, dict)[name] = self self.owner, self.name = owner, name