From b634b2a9731aca4ad6cf65d9782c9b39859728dd Mon Sep 17 00:00:00 2001 From: "Marcel R." Date: Wed, 7 Aug 2024 13:39:45 +0200 Subject: [PATCH] Add getitem support. --- scinum/__init__.py | 15 ++++++++++++++- tests/test_number.py | 8 ++++++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/scinum/__init__.py b/scinum/__init__.py index 21a5d8e..9d255a9 100644 --- a/scinum/__init__.py +++ b/scinum/__init__.py @@ -840,7 +840,7 @@ def copy( if uncertainties is None: uncertainties = self.uncertainties - return self.__class__(nominal, uncertainties=uncertainties) + return self.__class__(nominal, uncertainties=uncertainties, **self._init_kwargs()) # type: ignore[arg-type] # noqa def get( self, @@ -1113,6 +1113,19 @@ def __call__( # shorthand for get return self.get(direction=direction, names=names, unc=unc, factor=factor) + def __getitem__(self, key: int | slice) -> Number: + if not self.is_numpy: + raise TypeError("cannot index non-NumPy number") + + return self.__class__( + self.nominal[key], + uncertainties={ + name: (up[key], down[key]) + for name, (up, down) in self.uncertainties.items() + }, + **self._init_kwargs(), # type: ignore[arg-type] + ) + def __float__(self) -> OutValueType: # extract nominal value return self.nominal diff --git a/tests/test_number.py b/tests/test_number.py index 4a073f9..4fe687d 100644 --- a/tests/test_number.py +++ b/tests/test_number.py @@ -150,6 +150,14 @@ def test_copy_numpy(self) -> None: self.assertEqual(len(num.uncertainties), 1) self.assertEqual(num.u(direction=UP).shape, (3,)) + @if_numpy + def test_getitem_numpy(self) -> None: + num = Number(np.array([5, 27, 42]), 5)[1:] + + self.assertEqual(tuple(num.nominal), (27, 42)) + self.assertEqual(len(num.uncertainties), 1) + self.assertEqual(tuple(num.uncertainties["default"][0]), (5, 5)) + def test_string_formats(self) -> None: self.assertEqual(len(self.num.str()), 102) self.assertEqual(len(self.num.str("%.3f")), 126)