[Python-checkins] Allow whitespace around a slash in fraction string inputs (GH-96496)
rhettinger
webhook-mailer at python.org
Fri Sep 2 12:11:08 EDT 2022
https://github.com/python/cpython/commit/656167db81a53934da55d90ed431449d8a4fc14b
commit: 656167db81a53934da55d90ed431449d8a4fc14b
branch: main
author: Raymond Hettinger <rhettinger at users.noreply.github.com>
committer: rhettinger <rhettinger at users.noreply.github.com>
date: 2022-09-02T11:10:58-05:00
summary:
Allow whitespace around a slash in fraction string inputs (GH-96496)
files:
A Misc/NEWS.d/next/Documentation/2022-09-01-17-03-04.gh-issue-96432.1EJ1-4.rst
M Doc/library/fractions.rst
M Lib/fractions.py
M Lib/test/test_fractions.py
diff --git a/Doc/library/fractions.rst b/Doc/library/fractions.rst
index 5f0ecf1f135e..3751800b3b11 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 738a0d4c301d..43b72ae41438 100644
--- a/Lib/fractions.py
+++ b/Lib/fractions.py
@@ -26,7 +26,7 @@
(?=\d|\.\d) # lookahead for digit or .digit
(?P<num>\d*|\d+(_\d+)*) # numerator (possibly empty)
(?: # followed by
- (?:/(?P<denom>\d+(_\d+)*))? # an optional denominator
+ (?:\s*/\s*(?P<denom>\d+(_\d+)*))? # an optional denominator
| # or
(?:\.(?P<decimal>d*|\d+(_\d+)*))? # an optional fractional part
(?:E(?P<exp>[-+]?\d+(_\d+)*))? # and optional exponent
diff --git a/Lib/test/test_fractions.py b/Lib/test/test_fractions.py
index fc46e8674fc4..7fa9dbea905b 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 000000000000..a5858f432932
--- /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')`.
More information about the Python-checkins
mailing list