예제 #1
0
    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
예제 #2
0
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
예제 #3
0
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)
예제 #4
0
 def __set_name__(self, owner: 'InstrumentHandler', name: str) -> None:
     setdefault_attr_from_factory(owner, _test_instruments_key,
                                  dict)[name] = self
     setattr(owner, name, self)
예제 #5
0
 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
예제 #6
0
 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
예제 #7
0
 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
예제 #8
0
 def __set_name__(self, owner, name):
     setdefault_attr_from_factory(owner, _module_map_key,
                                  dict)[self.device_name] = self
예제 #9
0
파일: proxy.py 프로젝트: pcreagan/test_old
 def __set_name__(self, owner, name):
     setdefault_attr_from_factory(owner, self.registry_key,
                                  dict)[name] = self
     self.owner, self.name = owner, name