summaryrefslogtreecommitdiffstats
path: root/Lib/fractions.py
diff options
context:
space:
mode:
authorSergey B Kirpichev <skirpichev@gmail.com>2021-06-07 07:06:33 (GMT)
committerGitHub <noreply@github.com>2021-06-07 07:06:33 (GMT)
commit89e50ab36fac6a0e7f1998501f36fcd2872a6604 (patch)
tree8f708926c1f7f64b60d7da505fd0dbe8e1d2d4a4 /Lib/fractions.py
parentafb2eed72b32a35b4726ff35f92e4fbf54926046 (diff)
downloadcpython-89e50ab36fac6a0e7f1998501f36fcd2872a6604.zip
cpython-89e50ab36fac6a0e7f1998501f36fcd2872a6604.tar.gz
cpython-89e50ab36fac6a0e7f1998501f36fcd2872a6604.tar.bz2
bpo-44258: support PEP 515 for Fraction's initialization from string (GH-26422)
* bpo-44258: support PEP 515 for Fraction's initialization from string * regexps's version * A different regexps version, which doesn't suffer from catastrophic backtracking * revert denom -> den * strip "_" from the decimal str, add few tests * drop redundant tests * Add versionchanged & whatsnew entry * Amend Fraction constructor docs * Change .. versionchanged:...
Diffstat (limited to 'Lib/fractions.py')
-rw-r--r--Lib/fractions.py21
1 files changed, 11 insertions, 10 deletions
diff --git a/Lib/fractions.py b/Lib/fractions.py
index 66e6831..180cd94 100644
--- a/Lib/fractions.py
+++ b/Lib/fractions.py
@@ -21,17 +21,17 @@ _PyHASH_MODULUS = sys.hash_info.modulus
_PyHASH_INF = sys.hash_info.inf
_RATIONAL_FORMAT = re.compile(r"""
- \A\s* # optional whitespace at the start, then
- (?P<sign>[-+]?) # an optional sign, then
- (?=\d|\.\d) # lookahead for digit or .digit
- (?P<num>\d*) # numerator (possibly empty)
- (?: # followed by
- (?:/(?P<denom>\d+))? # an optional denominator
- | # or
- (?:\.(?P<decimal>\d*))? # an optional fractional part
- (?:E(?P<exp>[-+]?\d+))? # and optional exponent
+ \A\s* # optional whitespace at the start,
+ (?P<sign>[-+]?) # an optional sign, then
+ (?=\d|\.\d) # lookahead for digit or .digit
+ (?P<num>\d*|\d+(_\d+)*) # numerator (possibly empty)
+ (?: # followed by
+ (?:/(?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
)
- \s*\Z # and optional whitespace to finish
+ \s*\Z # and optional whitespace to finish
""", re.VERBOSE | re.IGNORECASE)
@@ -122,6 +122,7 @@ class Fraction(numbers.Rational):
denominator = 1
decimal = m.group('decimal')
if decimal:
+ decimal = decimal.replace('_', '')
scale = 10**len(decimal)
numerator = numerator * scale + int(decimal)
denominator *= scale