From 5ca4fe15c1a14e0f5ed8627b694e26fee81240d7 Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Thu, 1 Sep 2022 17:05:48 -0500 Subject: [PATCH] Add docs --- Doc/library/fractions.rst | 3 +++ Lib/fractions.py | 2 +- Lib/test/test_fractions.py | 4 +--- .../2022-09-01-17-03-04.gh-issue-96432.1EJ1-4.rst | 2 ++ 4 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Documentation/2022-09-01-17-03-04.gh-issue-96432.1EJ1-4.rst diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst index 5f0ecf1f135ea5..3751800b3b1118 100644 --- a/Doc/library/fractions.rst +++ b/Doc/library/fractions.rst @@ -98,6 +98,9 @@ another rational number, or from a string. :class:`Fraction` implements ``__int__`` now to satisfy ``typing.SupportsInt`` instance checks. + .. versionchanged:: 3.12 + Space is allowed around the slash for string inputs: `Fraction('2 / 3')`. + .. attribute:: numerator Numerator of the Fraction in lowest term. diff --git a/Lib/fractions.py b/Lib/fractions.py index 738a0d4c301d43..43b72ae414381a 100644 --- a/Lib/fractions.py +++ b/Lib/fractions.py @@ -26,7 +26,7 @@ (?=\d|\.\d) # lookahead for digit or .digit (?P\d*|\d+(_\d+)*) # numerator (possibly empty) (?: # followed by - (?:/(?P\d+(_\d+)*))? # an optional denominator + (?:\s*/\s*(?P\d+(_\d+)*))? # an optional denominator | # or (?:\.(?Pd*|\d+(_\d+)*))? # an optional fractional part (?:E(?P[-+]?\d+(_\d+)*))? # and optional exponent diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py index fc46e8674fc46e..7fa9dbea905b59 100644 --- a/Lib/test/test_fractions.py +++ b/Lib/test/test_fractions.py @@ -162,6 +162,7 @@ def testInitFromDecimal(self): def testFromString(self): self.assertEqual((5, 1), _components(F("5"))) self.assertEqual((3, 2), _components(F("3/2"))) + self.assertEqual((3, 2), _components(F("3 / 2"))) self.assertEqual((3, 2), _components(F(" \n +3/2"))) self.assertEqual((-3, 2), _components(F("-3/2 "))) self.assertEqual((13, 2), _components(F(" 013/02 \n "))) @@ -190,9 +191,6 @@ def testFromString(self): self.assertRaisesMessage( ValueError, "Invalid literal for Fraction: '/2'", F, "/2") - self.assertRaisesMessage( - ValueError, "Invalid literal for Fraction: '3 /2'", - F, "3 /2") self.assertRaisesMessage( # Denominators don't need a sign. ValueError, "Invalid literal for Fraction: '3/+2'", diff --git a/Misc/NEWS.d/next/Documentation/2022-09-01-17-03-04.gh-issue-96432.1EJ1-4.rst b/Misc/NEWS.d/next/Documentation/2022-09-01-17-03-04.gh-issue-96432.1EJ1-4.rst new file mode 100644 index 00000000000000..a5858f432932ca --- /dev/null +++ b/Misc/NEWS.d/next/Documentation/2022-09-01-17-03-04.gh-issue-96432.1EJ1-4.rst @@ -0,0 +1,2 @@ +Fraction literals now support whitespace around the forward slash, +`Fraction('2 / 3')`.