@@ -382,9 +382,9 @@ cdef object _FLOAT_FORMAT_SPECIFICATION_MATCHER = re.compile(r"""
382382 # A '0' that's * not* followed by another digit is parsed as a minimum width
383383 # rather than a zeropad flag.
384384 ( ?P<zeropad> 0(?= [0-9 ]) ) ?
385- ( ?P<minimumwidth> 0 | [ 1-9 ][ 0-9 ]* ) ?
385+ ( ?P<minimumwidth> [ 0-9 ]+ ) ?
386386 ( ?P<thousands_sep> [,_ ]) ?
387- (?: \. ( ?P<precision> 0 | [ 1-9 ][ 0-9 ]* ) ) ?
387+ (?: \. ( ?P<precision> [ 0-9 ]+ ) ) ?
388388 ( ?P<presentation_type> [eEfFgG% ])
389389 $
390390""" , re.DOTALL | re.VERBOSE).match
@@ -451,8 +451,8 @@ cdef class Fraction:
451451 return
452452
453453 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 )
456456 if is_normalised:
457457 _normalize = False
458458 # fall through to normalisation below
@@ -947,7 +947,7 @@ cdef class Fraction:
947947 if x is not None :
948948 return NotImplemented
949949
950- if isinstance (b, ( int , long ) ):
950+ if isinstance (b, int ):
951951 return _pow(a.numerator, a.denominator, b, 1 )
952952 elif isinstance (b, (Fraction, Rational)):
953953 return _pow(a.numerator, a.denominator, b.numerator, b.denominator)
@@ -971,7 +971,7 @@ cdef class Fraction:
971971 # If a is an int, keep it that way if possible.
972972 return a ** bn
973973
974- if isinstance (a, ( int , long ) ):
974+ if isinstance (a, int ):
975975 return _pow(a, 1 , bn, bd)
976976 if isinstance (a, (Fraction, Rational)):
977977 return _pow(a.numerator, a.denominator, bn, bd)
@@ -1152,7 +1152,7 @@ cdef class Fraction:
11521152
11531153 @cython.final
11541154 cdef _eq(a, b):
1155- if type (b) is int or type (b) is long :
1155+ if type (b) is int :
11561156 return a._numerator == b and a._denominator == 1
11571157 if type (b) is Fraction:
11581158 return (a._numerator == (< Fraction> b)._numerator and
@@ -1183,7 +1183,7 @@ cdef class Fraction:
11831183
11841184 """
11851185 # convert other to a Rational instance where reasonable.
1186- if isinstance (other, ( int , long ) ):
1186+ if isinstance (other, int ):
11871187 a = self ._numerator
11881188 b = self ._denominator * other
11891189 elif type (other) is Fraction:
@@ -1591,7 +1591,7 @@ cdef _raise_parse_overflow(s):
15911591 s = repr (s)
15921592 if s[0 ] == ' b' :
15931593 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
15951595
15961596
15971597cdef extern from * :
@@ -1639,7 +1639,7 @@ cdef inline object _parse_pylong(char* c_digits_start, char** c_digits_end):
16391639
16401640
16411641@ 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 ):
16431643 """
16441644 Parse a string into a number tuple: (numerator, denominator, is_normalised)
16451645 """
@@ -1665,7 +1665,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
16651665 if AnyString is unicode :
16661666 _unpack_ustring(s, & s_len, & s_data, & s_kind)
16671667 if s_kind == 1 :
1668- return _parse_fraction(< char * > s_data, s_len)
1668+ return _parse_fraction(< char * > s_data, s_len, orig_str )
16691669 cdata = < char * > s_data
16701670 cdata += 0 # mark used
16711671 else :
@@ -1689,7 +1689,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
16891689 elif state in (NUM, NUM_SPACE):
16901690 num = _parse_pylong(c_digits_start, & c_digits)
16911691 else :
1692- _raise_invalid_input(s )
1692+ _raise_invalid_input(orig_str )
16931693 state = DENOM_START
16941694 break
16951695 elif c == u ' .' :
@@ -1700,31 +1700,31 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
17001700 elif state == NUM:
17011701 state = DECIMAL_DOT
17021702 else :
1703- _raise_invalid_input(s )
1703+ _raise_invalid_input(orig_str )
17041704 break
17051705 elif c in u ' eE' :
17061706 if state == SMALL_NUM:
17071707 num = inum
17081708 elif state == NUM:
17091709 num = _parse_pylong(c_digits_start, & c_digits)
17101710 else :
1711- _raise_invalid_input(s )
1711+ _raise_invalid_input(orig_str )
17121712 state = EXP_E
17131713 break
17141714 elif c in u ' -+' :
17151715 if state == BEGIN_SPACE:
17161716 is_neg = c == u ' -'
17171717 state = BEGIN_SIGN
17181718 else :
1719- _raise_invalid_input(s )
1719+ _raise_invalid_input(orig_str )
17201720 continue
17211721 elif c == u ' _' :
17221722 if state == SMALL_NUM:
17231723 state = SMALL_NUM_US
17241724 elif state == NUM:
17251725 state = NUM_US
17261726 else :
1727- _raise_invalid_input(s )
1727+ _raise_invalid_input(orig_str )
17281728 continue
17291729 else :
17301730 if c.isspace():
@@ -1743,10 +1743,10 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
17431743 num = _parse_pylong(c_digits_start, & c_digits)
17441744 state = NUM_SPACE
17451745 else :
1746- _raise_invalid_input(s )
1746+ _raise_invalid_input(orig_str )
17471747 continue
17481748
1749- _raise_invalid_input(s )
1749+ _raise_invalid_input(orig_str )
17501750 continue
17511751
17521752 # normal digit found
@@ -1780,7 +1780,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
17801780 break
17811781 pos += 1
17821782 else :
1783- _raise_invalid_input(s )
1783+ _raise_invalid_input(orig_str )
17841784
17851785 if state == DENOM_START:
17861786 # NUM '/' | SMALL_NUM '/'
@@ -1800,15 +1800,15 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
18001800 is_neg ^= (c == u ' -' )
18011801 state = DENOM_SIGN
18021802 else :
1803- _raise_invalid_input(s )
1803+ _raise_invalid_input(orig_str )
18041804 continue
18051805 elif c == u ' _' :
18061806 if state == SMALL_DENOM:
18071807 state = SMALL_DENOM_US
18081808 elif state == DENOM:
18091809 state = DENOM_US
18101810 else :
1811- _raise_invalid_input(s )
1811+ _raise_invalid_input(orig_str )
18121812 continue
18131813 else :
18141814 if c.isspace():
@@ -1825,11 +1825,11 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
18251825 elif state == DENOM:
18261826 denom = _parse_pylong(c_digits_start, & c_digits)
18271827 else :
1828- _raise_invalid_input(s )
1828+ _raise_invalid_input(orig_str )
18291829 state = DENOM_SPACE
18301830 continue
18311831
1832- _raise_invalid_input(s )
1832+ _raise_invalid_input(orig_str )
18331833 continue
18341834
18351835 # normal digit found
@@ -1863,7 +1863,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
18631863 break
18641864 pos += 1
18651865 else :
1866- _raise_invalid_input(s )
1866+ _raise_invalid_input(orig_str )
18671867
18681868 elif state in (SMALL_DECIMAL_DOT, START_DECIMAL_DOT):
18691869 # SMALL_NUM '.' | '.'
@@ -1876,13 +1876,13 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
18761876 if state == SMALL_DECIMAL:
18771877 state = SMALL_DECIMAL_US
18781878 else :
1879- _raise_invalid_input(s )
1879+ _raise_invalid_input(orig_str )
18801880 continue
18811881 elif c in u ' eE' :
18821882 if state in (SMALL_DECIMAL_DOT, SMALL_DECIMAL):
18831883 num = inum
18841884 else :
1885- _raise_invalid_input(s )
1885+ _raise_invalid_input(orig_str )
18861886 state = EXP_E
18871887 break
18881888 else :
@@ -1897,10 +1897,10 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
18971897 num = inum
18981898 state = SMALL_END_SPACE
18991899 else :
1900- _raise_invalid_input(s )
1900+ _raise_invalid_input(orig_str )
19011901 continue
19021902
1903- _raise_invalid_input(s )
1903+ _raise_invalid_input(orig_str )
19041904 continue
19051905
19061906 # normal digit found
@@ -1923,7 +1923,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
19231923 state = DECIMAL
19241924 break
19251925 else :
1926- _raise_invalid_input(s )
1926+ _raise_invalid_input(orig_str )
19271927
19281928 if state in (DECIMAL_DOT, DECIMAL):
19291929 # NUM '.' | SMALL_DECIMAL->DECIMAL
@@ -1936,24 +1936,24 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
19361936 if state == DECIMAL:
19371937 state = DECIMAL_US
19381938 else :
1939- _raise_invalid_input(s )
1939+ _raise_invalid_input(orig_str )
19401940 continue
19411941 elif c in u ' eE' :
19421942 if state in (DECIMAL_DOT, DECIMAL):
19431943 num = _parse_pylong(c_digits_start, & c_digits)
19441944 else :
1945- _raise_invalid_input(s )
1945+ _raise_invalid_input(orig_str )
19461946 state = EXP_E
19471947 break
19481948 else :
19491949 if c.isspace():
19501950 if state in (DECIMAL, DECIMAL_DOT):
19511951 state = END_SPACE
19521952 else :
1953- _raise_invalid_input(s )
1953+ _raise_invalid_input(orig_str )
19541954 break
19551955
1956- _raise_invalid_input(s )
1956+ _raise_invalid_input(orig_str )
19571957 continue
19581958
19591959 # normal digit found
@@ -1970,7 +1970,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
19701970 decimal_len += 1
19711971 pos += 1
19721972 else :
1973- _raise_invalid_input(s )
1973+ _raise_invalid_input(orig_str )
19741974
19751975 if state == EXP_E:
19761976 # (SMALL_) NUM ['.' DECIMAL] 'E'
@@ -1984,23 +1984,23 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
19841984 exp_is_neg = c == u ' -'
19851985 state = EXP_SIGN
19861986 else :
1987- _raise_invalid_input(s )
1987+ _raise_invalid_input(orig_str )
19881988 continue
19891989 elif c == u ' _' :
19901990 if state == EXP:
19911991 state = EXP_US
19921992 else :
1993- _raise_invalid_input(s )
1993+ _raise_invalid_input(orig_str )
19941994 continue
19951995 else :
19961996 if c.isspace():
19971997 if state == EXP:
19981998 state = END_SPACE
19991999 else :
2000- _raise_invalid_input(s )
2000+ _raise_invalid_input(orig_str )
20012001 break
20022002
2003- _raise_invalid_input(s )
2003+ _raise_invalid_input(orig_str )
20042004 continue
20052005
20062006 # normal digit found
@@ -2018,9 +2018,9 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
20182018 pos += 1
20192019
20202020 if iexp > MAX_SMALL_NUMBER:
2021- _raise_parse_overflow(s )
2021+ _raise_parse_overflow(orig_str )
20222022 else :
2023- _raise_invalid_input(s )
2023+ _raise_invalid_input(orig_str )
20242024
20252025 if state in (END_SPACE, SMALL_END_SPACE, DENOM_SPACE):
20262026 while pos < s_len:
@@ -2030,7 +2030,7 @@ cdef tuple _parse_fraction(AnyString s, Py_ssize_t s_len):
20302030 pos += 1
20312031
20322032 if pos < s_len :
2033- _raise_invalid_input(s )
2033+ _raise_invalid_input(orig_str )
20342034
20352035 is_normalised = False
20362036 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):
20672067 elif state == DENOM_SPACE:
20682068 pass
20692069 else :
2070- _raise_invalid_input(s )
2070+ _raise_invalid_input(orig_str )
20712071
20722072 if decimal_len > MAX_SMALL_NUMBER:
2073- _raise_parse_overflow(s )
2073+ _raise_parse_overflow(orig_str )
20742074 if exp_is_neg:
20752075 iexp = - iexp
20762076 iexp -= decimal_len
0 commit comments