Skip to content

Commit 0d6d50c

Browse files
committed
gh-140938: Raise ValueError for infinite inputs to stdev/pstdev
1 parent a486d45 commit 0d6d50c

3 files changed

Lines changed: 22 additions & 5 deletions

File tree

Lib/statistics.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -619,9 +619,14 @@ def stdev(data, xbar=None):
619619
if n < 2:
620620
raise StatisticsError('stdev requires at least two data points')
621621
mss = ss / (n - 1)
622+
try:
623+
mss_numerator = mss.numerator
624+
mss_denominator = mss.denominator
625+
except AttributeError:
626+
raise ValueError
622627
if issubclass(T, Decimal):
623-
return _decimal_sqrt_of_frac(mss.numerator, mss.denominator)
624-
return _float_sqrt_of_frac(mss.numerator, mss.denominator)
628+
return _decimal_sqrt_of_frac(mss_numerator, mss_denominator)
629+
return _float_sqrt_of_frac(mss_numerator, mss_denominator)
625630

626631

627632
def pstdev(data, mu=None):
@@ -637,9 +642,14 @@ def pstdev(data, mu=None):
637642
if n < 1:
638643
raise StatisticsError('pstdev requires at least one data point')
639644
mss = ss / n
645+
try:
646+
mss_numerator = mss.numerator
647+
mss_denominator = mss.denominator
648+
except AttributeError:
649+
raise ValueError
640650
if issubclass(T, Decimal):
641-
return _decimal_sqrt_of_frac(mss.numerator, mss.denominator)
642-
return _float_sqrt_of_frac(mss.numerator, mss.denominator)
651+
return _decimal_sqrt_of_frac(mss_numerator, mss_denominator)
652+
return _float_sqrt_of_frac(mss_numerator, mss_denominator)
643653

644654

645655
## Statistics for relations between two inputs #############################

Lib/test/test_statistics.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2005,7 +2005,6 @@ def test_iter_list_same(self):
20052005
expected = self.func(data)
20062006
self.assertEqual(self.func(iter(data)), expected)
20072007

2008-
20092008
class TestPVariance(VarianceStdevMixin, NumericTestCase, UnivariateTypeMixin):
20102009
# Tests for population variance.
20112010
def setUp(self):
@@ -2113,6 +2112,12 @@ def test_center_not_at_mean(self):
21132112
self.assertEqual(self.func(data), 2.5)
21142113
self.assertEqual(self.func(data, mu=0.5), 6.5)
21152114

2115+
def test_gh_140938(self):
2116+
# Inputs with math.inf should raise a ValueError
2117+
with self.assertRaises(ValueError):
2118+
self.func([1.0, math.inf])
2119+
2120+
21162121
class TestSqrtHelpers(unittest.TestCase):
21172122

21182123
def test_integer_sqrt_of_frac_rto(self):
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
The ``statistics.stdev`` and ``statistics.pstdev`` function now raise a
2+
``ValueError`` when the input contains an infinity.

0 commit comments

Comments
 (0)