def __init__( self, parameter: "ParameterBase", keys: Optional[Any] = None, start: Optional[float] = None, stop: Optional[float] = None, step: Optional[float] = None, num: Optional[int] = None, ): super().__init__(parameter) self._snapshot: Dict[str, Any] = {} self._value_snapshot: List[Dict[str, Any]] = [] if keys is None: if start is None: raise ValueError("If keys is None, start needs to be not None.") if stop is None: raise ValueError("If keys is None, stop needs to be not None.") keys = make_sweep(start=start, stop=stop, step=step, num=num) self._values = keys self._add_linear_snapshot(self._values) elif isinstance(keys, slice): self._add_slice(keys) self._add_linear_snapshot(self._values) elif is_sequence(keys): for key in keys: if isinstance(key, slice): self._add_slice(key) elif is_sequence(key): # not sure if we really need to support this (and I'm not # going to recurse any more!) but we will get nested lists # if for example someone does `p[list1, list2]` self._values.extend(key) else: # assume a single value self._values.append(key) # we dont want the snapshot to go crazy on big data if self._values: self._add_sequence_snapshot(self._values) else: # assume a single value self._values.append(keys) self._value_snapshot.append({"item": keys}) self.validate(self._values)
def test_no(self): with open(__file__, 'r') as f: no_sequence = [ 1, 1.0, True, None, 'you can iterate a string but we won\'t', b'nor will we iterate bytes', self.a_func, self.AClass, self.AClass(), # previously dicts, sets, and files all returned True, but # we've eliminated them now. { 1: 2, 3: 4 }, set((1, 2, 3)), f ] for val in no_sequence: with self.subTest(val=val): self.assertFalse(is_sequence(val))
def extend( self, new_values: Union[Sequence[Any], 'SweepFixedValues'] ) -> None: """ Extend sweep with new_values Args: new_values: new values to append Raises: TypeError: if new_values is not Sequence, nor SweepFixedValues """ if isinstance(new_values, SweepFixedValues): if new_values.parameter is not self.parameter: raise TypeError( 'can only extend SweepFixedValues of the same parameters') # these values are already validated self._values.extend(new_values._values) self._value_snapshot.extend(new_values._value_snapshot) elif is_sequence(new_values): self.validate(new_values) self._values.extend(new_values) self._add_sequence_snapshot(new_values) else: raise TypeError( f'cannot extend SweepFixedValues with {new_values}')
def __init__(self, parameter, keys=None, start=None, stop=None, step=None, num=None): super().__init__(parameter) self._snapshot = {} self._value_snapshot = [] if keys is None: keys = make_sweep(start=start, stop=stop, step=step, num=num) self._values = keys self._add_linear_snapshot(self._values) elif isinstance(keys, slice): self._add_slice(keys) self._add_linear_snapshot(self._values) elif is_sequence(keys): for key in keys: if isinstance(key, slice): self._add_slice(key) elif is_sequence(key): # not sure if we really need to support this (and I'm not # going to recurse any more!) but we will get nested lists # if for example someone does `p[list1, list2]` self._values.extend(key) else: # assume a single value self._values.append(key) # we dont want the snapshot to go crazy on big data if self._values: self._add_sequence_snapshot(self._values) else: # assume a single value self._values.append(keys) self._value_snapshot.append({'item': keys}) self.validate(self._values)
def test_yes(self): yes_sequence = [ [], [1, 2, 3], range(5), (), ('lions', 'tigers', 'bears'), # we do have to be careful about generators... # ie don't call len() or iterate twice (i**2 for i in range(5)), ] for val in yes_sequence: with self.subTest(val=val): self.assertTrue(is_sequence(val))
def test_open_file_is_not_sequence(): with open(__file__) as f: assert not is_sequence(f)
def test_no(val): assert not is_sequence(val)
def test_yes(val): assert is_sequence(val)