示例#1
0
    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)
示例#2
0
    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))
示例#3
0
    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}')
示例#4
0
    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)
示例#5
0
    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))
示例#6
0
def test_open_file_is_not_sequence():
    with open(__file__) as f:
        assert not is_sequence(f)
示例#7
0
def test_no(val):
    assert not is_sequence(val)
示例#8
0
def test_yes(val):
    assert is_sequence(val)