diff options
author | Sergey B Kirpichev <skirpichev@gmail.com> | 2021-06-07 07:06:33 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-06-07 07:06:33 (GMT) |
commit | 89e50ab36fac6a0e7f1998501f36fcd2872a6604 (patch) | |
tree | 8f708926c1f7f64b60d7da505fd0dbe8e1d2d4a4 /Lib/fractions.py | |
parent | afb2eed72b32a35b4726ff35f92e4fbf54926046 (diff) | |
download | cpython-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.py | 21 |
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 |