From 68cc732943b1723fa49215bc288c6a0135890719 Mon Sep 17 00:00:00 2001 From: Kaleb Barrett Date: Sun, 4 Apr 2021 15:34:36 -0500 Subject: [PATCH] Improve constructor --- cocotb/types/array.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/cocotb/types/array.py b/cocotb/types/array.py index 0420247c48..7edb2a124a 100644 --- a/cocotb/types/array.py +++ b/cocotb/types/array.py @@ -94,11 +94,11 @@ def __init__( self, value: Optional[Iterable[Any]] = None, range: Optional[Range] = None ): if value is not None and range is None: - self._value = list(value) - self._range = Range(0, "to", len(self._value) - 1) + self._value = self._construct_value(value) + self._range = self._construct_range(Range(0, "to", len(self._value) - 1)) elif value is not None and range is not None: - self._value = list(value) - self._range = range + self._value = self._construct_value(value) + self._range = self._construct_range(range) if len(self._value) != len(self._range): raise ValueError( "init value of length {!r} not fit in {!r}".format( @@ -106,11 +106,19 @@ def __init__( ) ) elif value is None and range is not None: - self._value = [None] * len(range) - self._range = range + self._value = self._construct_value(None for _ in range) + self._range = self._construct_range(range) else: raise TypeError("must pass a value, range, or both") + _construct_value = list + + @staticmethod + def _construct_range(rng: Any) -> Range: + if isinstance(rng, Range): + return rng + raise TypeError("range argument must be of type 'Range'") + @cached_property def left(self) -> int: """Leftmost index of the array."""