Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 14 additions & 4 deletions Lib/statistics.py
Original file line number Diff line number Diff line change
Expand Up @@ -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('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)
return _decimal_sqrt_of_frac(mss_numerator, mss_denominator)
return _float_sqrt_of_frac(mss_numerator, mss_denominator)


def pstdev(data, mu=None):
Expand All @@ -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('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)
return _decimal_sqrt_of_frac(mss_numerator, mss_denominator)
return _float_sqrt_of_frac(mss_numerator, mss_denominator)


## Statistics for relations between two inputs #############################
Expand Down
9 changes: 8 additions & 1 deletion Lib/test/test_statistics.py
Original file line number Diff line number Diff line change
Expand Up @@ -2005,7 +2005,6 @@ def test_iter_list_same(self):
expected = self.func(data)
self.assertEqual(self.func(iter(data)), expected)


Copy link
Member

@picnixz picnixz Nov 13, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think this line removal wasn't intended.

class TestPVariance(VarianceStdevMixin, NumericTestCase, UnivariateTypeMixin):
# Tests for population variance.
def setUp(self):
Expand Down Expand Up @@ -2113,6 +2112,14 @@ 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 inf/nan 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):

def test_integer_sqrt_of_frac_rto(self):
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
The :func:`statistics.stdev` and :func:`statistics.pstdev` functions now raise a
:exc:`ValueError` when the input contains an infinity or a NaN.
Loading