From 0d6d50cb59a53c103e38fb1440938b06a343a0e9 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 13 Nov 2025 14:58:12 -0600 Subject: [PATCH 1/8] gh-140938: Raise ValueError for infinite inputs to stdev/pstdev --- Lib/statistics.py | 18 ++++++++++++++---- Lib/test/test_statistics.py | 7 ++++++- ...5-11-13-14-51-30.gh-issue-140938.kXsHHv.rst | 2 ++ 3 files changed, 22 insertions(+), 5 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst diff --git a/Lib/statistics.py b/Lib/statistics.py index 3d805cb073987d..b89397913dffd8 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -619,9 +619,14 @@ def stdev(data, xbar=None): if n < 2: raise StatisticsError('stdev requires at least two data points') mss = ss / (n - 1) + try: + mss_numerator = mss.numerator + mss_denominator = mss.denominator + except AttributeError: + raise ValueError if issubclass(T, Decimal): - return _decimal_sqrt_of_frac(mss.numerator, mss.denominator) - return _float_sqrt_of_frac(mss.numerator, mss.denominator) + return _decimal_sqrt_of_frac(mss_numerator, mss_denominator) + return _float_sqrt_of_frac(mss_numerator, mss_denominator) def pstdev(data, mu=None): @@ -637,9 +642,14 @@ def pstdev(data, mu=None): if n < 1: raise StatisticsError('pstdev requires at least one data point') mss = ss / n + try: + mss_numerator = mss.numerator + mss_denominator = mss.denominator + except AttributeError: + raise ValueError if issubclass(T, Decimal): - return _decimal_sqrt_of_frac(mss.numerator, mss.denominator) - return _float_sqrt_of_frac(mss.numerator, mss.denominator) + return _decimal_sqrt_of_frac(mss_numerator, mss_denominator) + return _float_sqrt_of_frac(mss_numerator, mss_denominator) ## Statistics for relations between two inputs ############################# diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 8250b0aef09aec..02192c67a1e494 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2005,7 +2005,6 @@ def test_iter_list_same(self): expected = self.func(data) self.assertEqual(self.func(iter(data)), expected) - class TestPVariance(VarianceStdevMixin, NumericTestCase, UnivariateTypeMixin): # Tests for population variance. def setUp(self): @@ -2113,6 +2112,12 @@ def test_center_not_at_mean(self): self.assertEqual(self.func(data), 2.5) self.assertEqual(self.func(data, mu=0.5), 6.5) + def test_gh_140938(self): + # Inputs with math.inf should raise a ValueError + with self.assertRaises(ValueError): + self.func([1.0, math.inf]) + + class TestSqrtHelpers(unittest.TestCase): def test_integer_sqrt_of_frac_rto(self): diff --git a/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst b/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst new file mode 100644 index 00000000000000..838c5aa63a23b2 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst @@ -0,0 +1,2 @@ +The ``statistics.stdev`` and ``statistics.pstdev`` function now raise a +``ValueError`` when the input contains an infinity. From 34075e0945a2462bf84870a7ef8336c549459ae2 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 13 Nov 2025 15:02:21 -0600 Subject: [PATCH 2/8] Trim whitespace --- Lib/test/test_statistics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 02192c67a1e494..b093d2a78e05a6 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2117,7 +2117,7 @@ def test_gh_140938(self): with self.assertRaises(ValueError): self.func([1.0, math.inf]) - + class TestSqrtHelpers(unittest.TestCase): def test_integer_sqrt_of_frac_rto(self): From 9e29e3ce722c35e838c45e3604d2e1c89f637479 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 14 Nov 2025 13:19:51 -0600 Subject: [PATCH 3/8] Update Lib/statistics.py Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/statistics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/statistics.py b/Lib/statistics.py index b89397913dffd8..a13c2b1669bca0 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -646,7 +646,7 @@ def pstdev(data, mu=None): mss_numerator = mss.numerator mss_denominator = mss.denominator except AttributeError: - raise ValueError + raise ValueError('inf or nan encountered in data') if issubclass(T, Decimal): return _decimal_sqrt_of_frac(mss_numerator, mss_denominator) return _float_sqrt_of_frac(mss_numerator, mss_denominator) From f72e1c3e29804cd21675bad13ed8663f99b00390 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 14 Nov 2025 13:21:05 -0600 Subject: [PATCH 4/8] Update Lib/statistics.py Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/statistics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/statistics.py b/Lib/statistics.py index a13c2b1669bca0..26cf925529ea60 100644 --- a/Lib/statistics.py +++ b/Lib/statistics.py @@ -623,7 +623,7 @@ def stdev(data, xbar=None): mss_numerator = mss.numerator mss_denominator = mss.denominator except AttributeError: - raise ValueError + raise ValueError('inf or nan encountered in data') if issubclass(T, Decimal): return _decimal_sqrt_of_frac(mss_numerator, mss_denominator) return _float_sqrt_of_frac(mss_numerator, mss_denominator) From c2e821a6032204cd9b2368a1922d62a0af55c3ec Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 14 Nov 2025 13:21:16 -0600 Subject: [PATCH 5/8] Update Lib/test/test_statistics.py Co-authored-by: Gregory P. Smith <68491+gpshead@users.noreply.github.com> --- Lib/test/test_statistics.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index b093d2a78e05a6..0867dca3034f15 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2116,6 +2116,8 @@ def test_gh_140938(self): # Inputs with math.inf should raise a ValueError with self.assertRaises(ValueError): self.func([1.0, math.inf]) + with self.assertRaises(ValueError): + self.func([1.0, math.nan]) class TestSqrtHelpers(unittest.TestCase): From e33dd4b2a1d2417b80545ebafc6810180b51dffa Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 14 Nov 2025 13:21:32 -0600 Subject: [PATCH 6/8] Update Lib/test/test_statistics.py MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- Lib/test/test_statistics.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Lib/test/test_statistics.py b/Lib/test/test_statistics.py index 0867dca3034f15..677a87b51b9192 100644 --- a/Lib/test/test_statistics.py +++ b/Lib/test/test_statistics.py @@ -2113,7 +2113,7 @@ def test_center_not_at_mean(self): self.assertEqual(self.func(data, mu=0.5), 6.5) def test_gh_140938(self): - # Inputs with math.inf should raise a ValueError + # Inputs with inf/nan should raise a ValueError with self.assertRaises(ValueError): self.func([1.0, math.inf]) with self.assertRaises(ValueError): From a5e8ca7bb3d5f4dc5db214ae6ef2bee329b43fcf Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Fri, 14 Nov 2025 13:21:45 -0600 Subject: [PATCH 7/8] Update Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- .../next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst b/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst index 838c5aa63a23b2..176381799f1ba0 100644 --- a/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst +++ b/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst @@ -1,2 +1,2 @@ The ``statistics.stdev`` and ``statistics.pstdev`` function now raise a -``ValueError`` when the input contains an infinity. +:exc:`ValueError` when the input contains an infinity or a NaN. From b32c441972ec7c7f8510bd964aeaf8c2ae300d09 Mon Sep 17 00:00:00 2001 From: "Gregory P. Smith" <68491+gpshead@users.noreply.github.com> Date: Fri, 14 Nov 2025 14:52:14 -0800 Subject: [PATCH 8/8] Update Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com> --- .../next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst b/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst index 176381799f1ba0..bd3044002a2d54 100644 --- a/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst +++ b/Misc/NEWS.d/next/Library/2025-11-13-14-51-30.gh-issue-140938.kXsHHv.rst @@ -1,2 +1,2 @@ -The ``statistics.stdev`` and ``statistics.pstdev`` function now raise a +The :func:`statistics.stdev` and :func:`statistics.pstdev` functions now raise a :exc:`ValueError` when the input contains an infinity or a NaN.