@@ -382,9 +382,9 @@ cdef object _FLOAT_FORMAT_SPECIFICATION_MATCHER = re.compile(r"""
382
382
# A '0' that's * not* followed by another digit is parsed as a minimum width
383
383
# rather than a zeropad flag.
384
384
( ?P<zeropad> 0(?= [0-9 ]) ) ?
385
- ( ?P<minimumwidth> 0 | [ 1-9 ][ 0-9 ]* ) ?
385
+ ( ?P<minimumwidth> [ 0-9 ]+ ) ?
386
386
( ?P<thousands_sep> [,_ ]) ?
387
- (?: \. ( ?P<precision> 0 | [ 1-9 ][ 0-9 ]* ) ) ?
387
+ (?: \. ( ?P<precision> [ 0-9 ]+ ) ) ?
388
388
( ?P<presentation_type> [eEfFgG% ])
389
389
$
390
390
""" , re.DOTALL | re.VERBOSE).match
@@ -451,8 +451,8 @@ cdef class Fraction:
451
451
return
452
452
453
453
elif isinstance (numerator, unicode ):
454
- numerator, denominator, is_normalised = _parse_fraction(
455
- < unicode > numerator, len (< unicode > numerator))
454
+ numerator, denominator, is_normalised = _parse_fraction[ unicode ] (
455
+ < unicode > numerator, len (< unicode > numerator), numerator )
456
456
if is_normalised:
457
457
_normalize = False
458
458
# fall through to normalisation below
@@ -947,7 +947,7 @@ cdef class Fraction:
947
947
if x is not None :
948
948
return NotImplemented
949
949
950
- if isinstance (b, ( int , long ) ):
950
+ if isinstance (b, int ):
951
951
return _pow(a.numerator, a.denominator, b, 1 )
952
952
elif isinstance (b, (Fraction, Rational)):
953
953
return _pow(a.numerator, a.denominator, b.numerator, b.denominator)
@@ -971,7 +971,7 @@ cdef class Fraction:
971
971
# If a is an int, keep it that way if possible.
972
972
return a ** bn
973
973
974
- if isinstance (a, ( int , long ) ):
974
+ if isinstance (a, int ):
975
975
return _pow(a, 1 , bn, bd)
976
976
if isinstance (a, (Fraction, Rational)):
977
977
return _pow(a.numerator, a.denominator, bn, bd)
@@ -1152,7 +1152,7 @@ cdef class Fraction:
1152
1152
1153
1153
@cython.final
1154
1154
cdef _eq(a, b):
1155
- if type (b) is int or type (b) is long :
1155
+ if type (b) is int :
1156
1156
return a._numerator == b and a._denominator == 1
1157
1157
if type (b) is Fraction:
1158
1158
return (a._numerator == (< Fraction> b)._numerator and
@@ -1183,7 +1183,7 @@ cdef class Fraction:
1183
1183
1184
1184
"""
1185
1185
# convert other to a Rational instance where reasonable.
1186
- if isinstance (other, ( int , long ) ):
1186
+ if isinstance (other, int ):
1187
1187
a = self ._numerator
1188
1188
b = self ._denominator * other
1189
1189
elif type (other) is Fraction:
@@ -1591,7 +1591,7 @@ cdef _raise_parse_overflow(s):
1591
1591
s = repr (s)
1592
1592
if s[0 ] == ' b' :
1593
1593
s = s[1 :]
1594
- raise OverflowError (f" Exponent too large for Fraction: {s! s}" ) from None
1594
+ raise ValueError (f" Exponent too large for Fraction: {s}" ) from None
1595
1595
1596
1596
1597
1597
cdef extern from * :
@@ -1639,7 +1639,7 @@ cdef inline object _parse_pylong(char* c_digits_start, char** c_digits_end):
1639
1639
1640
1640
1641
1641
@ cython.cdivision (True )
1642
- cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1642
+ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len, orig_str ):
1643
1643
"""
1644
1644
Parse a string into a number tuple: (numerator, denominator, is_normalised)
1645
1645
"""
@@ -1665,7 +1665,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1665
1665
if AnyString is unicode :
1666
1666
_unpack_ustring(s, & s_len, & s_data, & s_kind)
1667
1667
if s_kind == 1 :
1668
- return _parse_fraction(< char * > s_data, s_len)
1668
+ return _parse_fraction(< char * > s_data, s_len, orig_str )
1669
1669
cdata = < char * > s_data
1670
1670
cdata += 0 # mark used
1671
1671
else :
@@ -1689,7 +1689,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1689
1689
elif state in (NUM, NUM_SPACE):
1690
1690
num = _parse_pylong(c_digits_start, & c_digits)
1691
1691
else :
1692
- _raise_invalid_input(s )
1692
+ _raise_invalid_input(orig_str )
1693
1693
state = DENOM_START
1694
1694
break
1695
1695
elif c == u ' .' :
@@ -1700,31 +1700,31 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1700
1700
elif state == NUM:
1701
1701
state = DECIMAL_DOT
1702
1702
else :
1703
- _raise_invalid_input(s )
1703
+ _raise_invalid_input(orig_str )
1704
1704
break
1705
1705
elif c in u ' eE' :
1706
1706
if state == SMALL_NUM:
1707
1707
num = inum
1708
1708
elif state == NUM:
1709
1709
num = _parse_pylong(c_digits_start, & c_digits)
1710
1710
else :
1711
- _raise_invalid_input(s )
1711
+ _raise_invalid_input(orig_str )
1712
1712
state = EXP_E
1713
1713
break
1714
1714
elif c in u ' -+' :
1715
1715
if state == BEGIN_SPACE:
1716
1716
is_neg = c == u ' -'
1717
1717
state = BEGIN_SIGN
1718
1718
else :
1719
- _raise_invalid_input(s )
1719
+ _raise_invalid_input(orig_str )
1720
1720
continue
1721
1721
elif c == u ' _' :
1722
1722
if state == SMALL_NUM:
1723
1723
state = SMALL_NUM_US
1724
1724
elif state == NUM:
1725
1725
state = NUM_US
1726
1726
else :
1727
- _raise_invalid_input(s )
1727
+ _raise_invalid_input(orig_str )
1728
1728
continue
1729
1729
else :
1730
1730
if c.isspace():
@@ -1743,10 +1743,10 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1743
1743
num = _parse_pylong(c_digits_start, & c_digits)
1744
1744
state = NUM_SPACE
1745
1745
else :
1746
- _raise_invalid_input(s )
1746
+ _raise_invalid_input(orig_str )
1747
1747
continue
1748
1748
1749
- _raise_invalid_input(s )
1749
+ _raise_invalid_input(orig_str )
1750
1750
continue
1751
1751
1752
1752
# normal digit found
@@ -1780,7 +1780,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1780
1780
break
1781
1781
pos += 1
1782
1782
else :
1783
- _raise_invalid_input(s )
1783
+ _raise_invalid_input(orig_str )
1784
1784
1785
1785
if state == DENOM_START:
1786
1786
# NUM '/' | SMALL_NUM '/'
@@ -1800,15 +1800,15 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1800
1800
is_neg ^= (c == u ' -' )
1801
1801
state = DENOM_SIGN
1802
1802
else :
1803
- _raise_invalid_input(s )
1803
+ _raise_invalid_input(orig_str )
1804
1804
continue
1805
1805
elif c == u ' _' :
1806
1806
if state == SMALL_DENOM:
1807
1807
state = SMALL_DENOM_US
1808
1808
elif state == DENOM:
1809
1809
state = DENOM_US
1810
1810
else :
1811
- _raise_invalid_input(s )
1811
+ _raise_invalid_input(orig_str )
1812
1812
continue
1813
1813
else :
1814
1814
if c.isspace():
@@ -1825,11 +1825,11 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1825
1825
elif state == DENOM:
1826
1826
denom = _parse_pylong(c_digits_start, & c_digits)
1827
1827
else :
1828
- _raise_invalid_input(s )
1828
+ _raise_invalid_input(orig_str )
1829
1829
state = DENOM_SPACE
1830
1830
continue
1831
1831
1832
- _raise_invalid_input(s )
1832
+ _raise_invalid_input(orig_str )
1833
1833
continue
1834
1834
1835
1835
# normal digit found
@@ -1863,7 +1863,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1863
1863
break
1864
1864
pos += 1
1865
1865
else :
1866
- _raise_invalid_input(s )
1866
+ _raise_invalid_input(orig_str )
1867
1867
1868
1868
elif state in (SMALL_DECIMAL_DOT, START_DECIMAL_DOT):
1869
1869
# SMALL_NUM '.' | '.'
@@ -1876,13 +1876,13 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1876
1876
if state == SMALL_DECIMAL:
1877
1877
state = SMALL_DECIMAL_US
1878
1878
else :
1879
- _raise_invalid_input(s )
1879
+ _raise_invalid_input(orig_str )
1880
1880
continue
1881
1881
elif c in u ' eE' :
1882
1882
if state in (SMALL_DECIMAL_DOT, SMALL_DECIMAL):
1883
1883
num = inum
1884
1884
else :
1885
- _raise_invalid_input(s )
1885
+ _raise_invalid_input(orig_str )
1886
1886
state = EXP_E
1887
1887
break
1888
1888
else :
@@ -1897,10 +1897,10 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1897
1897
num = inum
1898
1898
state = SMALL_END_SPACE
1899
1899
else :
1900
- _raise_invalid_input(s )
1900
+ _raise_invalid_input(orig_str )
1901
1901
continue
1902
1902
1903
- _raise_invalid_input(s )
1903
+ _raise_invalid_input(orig_str )
1904
1904
continue
1905
1905
1906
1906
# normal digit found
@@ -1923,7 +1923,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1923
1923
state = DECIMAL
1924
1924
break
1925
1925
else :
1926
- _raise_invalid_input(s )
1926
+ _raise_invalid_input(orig_str )
1927
1927
1928
1928
if state in (DECIMAL_DOT, DECIMAL):
1929
1929
# NUM '.' | SMALL_DECIMAL->DECIMAL
@@ -1936,24 +1936,24 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1936
1936
if state == DECIMAL:
1937
1937
state = DECIMAL_US
1938
1938
else :
1939
- _raise_invalid_input(s )
1939
+ _raise_invalid_input(orig_str )
1940
1940
continue
1941
1941
elif c in u ' eE' :
1942
1942
if state in (DECIMAL_DOT, DECIMAL):
1943
1943
num = _parse_pylong(c_digits_start, & c_digits)
1944
1944
else :
1945
- _raise_invalid_input(s )
1945
+ _raise_invalid_input(orig_str )
1946
1946
state = EXP_E
1947
1947
break
1948
1948
else :
1949
1949
if c.isspace():
1950
1950
if state in (DECIMAL, DECIMAL_DOT):
1951
1951
state = END_SPACE
1952
1952
else :
1953
- _raise_invalid_input(s )
1953
+ _raise_invalid_input(orig_str )
1954
1954
break
1955
1955
1956
- _raise_invalid_input(s )
1956
+ _raise_invalid_input(orig_str )
1957
1957
continue
1958
1958
1959
1959
# normal digit found
@@ -1970,7 +1970,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1970
1970
decimal_len += 1
1971
1971
pos += 1
1972
1972
else :
1973
- _raise_invalid_input(s )
1973
+ _raise_invalid_input(orig_str )
1974
1974
1975
1975
if state == EXP_E:
1976
1976
# (SMALL_) NUM ['.' DECIMAL] 'E'
@@ -1984,23 +1984,23 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
1984
1984
exp_is_neg = c == u ' -'
1985
1985
state = EXP_SIGN
1986
1986
else :
1987
- _raise_invalid_input(s )
1987
+ _raise_invalid_input(orig_str )
1988
1988
continue
1989
1989
elif c == u ' _' :
1990
1990
if state == EXP:
1991
1991
state = EXP_US
1992
1992
else :
1993
- _raise_invalid_input(s )
1993
+ _raise_invalid_input(orig_str )
1994
1994
continue
1995
1995
else :
1996
1996
if c.isspace():
1997
1997
if state == EXP:
1998
1998
state = END_SPACE
1999
1999
else :
2000
- _raise_invalid_input(s )
2000
+ _raise_invalid_input(orig_str )
2001
2001
break
2002
2002
2003
- _raise_invalid_input(s )
2003
+ _raise_invalid_input(orig_str )
2004
2004
continue
2005
2005
2006
2006
# normal digit found
@@ -2018,9 +2018,9 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
2018
2018
pos += 1
2019
2019
2020
2020
if iexp > MAX_SMALL_NUMBER:
2021
- _raise_parse_overflow(s )
2021
+ _raise_parse_overflow(orig_str )
2022
2022
else :
2023
- _raise_invalid_input(s )
2023
+ _raise_invalid_input(orig_str )
2024
2024
2025
2025
if state in (END_SPACE, SMALL_END_SPACE, DENOM_SPACE):
2026
2026
while pos < s_len:
@@ -2030,7 +2030,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
2030
2030
pos += 1
2031
2031
2032
2032
if pos < s_len :
2033
- _raise_invalid_input(s )
2033
+ _raise_invalid_input(orig_str )
2034
2034
2035
2035
is_normalised = False
2036
2036
if state in (SMALL_NUM, SMALL_DECIMAL, SMALL_DECIMAL_DOT, SMALL_END_SPACE):
@@ -2067,10 +2067,10 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
2067
2067
elif state == DENOM_SPACE:
2068
2068
pass
2069
2069
else :
2070
- _raise_invalid_input(s )
2070
+ _raise_invalid_input(orig_str )
2071
2071
2072
2072
if decimal_len > MAX_SMALL_NUMBER:
2073
- _raise_parse_overflow(s )
2073
+ _raise_parse_overflow(orig_str )
2074
2074
if exp_is_neg:
2075
2075
iexp = - iexp
2076
2076
iexp -= decimal_len
0 commit comments