mirror of
https://github.com/python/cpython.git
synced 2025-10-10 08:53:14 +00:00
Fix Issue #1769: Now int('- 1') or int('+ 1') is not allowed
any more. Thanks Juan Jose Conti. Also added tests.
This commit is contained in:
parent
587c2bfede
commit
2336bddd5d
3 changed files with 37 additions and 5 deletions
|
@ -49,7 +49,7 @@ class BitBucket:
|
||||||
def write(self, line):
|
def write(self, line):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
L = [
|
test_conv_no_sign = [
|
||||||
('0', 0),
|
('0', 0),
|
||||||
('1', 1),
|
('1', 1),
|
||||||
('9', 9),
|
('9', 9),
|
||||||
|
@ -71,6 +71,28 @@ L = [
|
||||||
(chr(0x200), ValueError),
|
(chr(0x200), ValueError),
|
||||||
]
|
]
|
||||||
|
|
||||||
|
test_conv_sign = [
|
||||||
|
('0', 0),
|
||||||
|
('1', 1),
|
||||||
|
('9', 9),
|
||||||
|
('10', 10),
|
||||||
|
('99', 99),
|
||||||
|
('100', 100),
|
||||||
|
('314', 314),
|
||||||
|
(' 314', ValueError),
|
||||||
|
('314 ', 314),
|
||||||
|
(' \t\t 314 \t\t ', ValueError),
|
||||||
|
(repr(sys.maxsize), sys.maxsize),
|
||||||
|
(' 1x', ValueError),
|
||||||
|
(' 1 ', ValueError),
|
||||||
|
(' 1\02 ', ValueError),
|
||||||
|
('', ValueError),
|
||||||
|
(' ', ValueError),
|
||||||
|
(' \t\t ', ValueError),
|
||||||
|
(str(b'\u0663\u0661\u0664 ','raw-unicode-escape'), 314),
|
||||||
|
(chr(0x200), ValueError),
|
||||||
|
]
|
||||||
|
|
||||||
class TestFailingBool:
|
class TestFailingBool:
|
||||||
def __bool__(self):
|
def __bool__(self):
|
||||||
raise RuntimeError
|
raise RuntimeError
|
||||||
|
@ -641,8 +663,18 @@ class BuiltinTest(unittest.TestCase):
|
||||||
# Different base:
|
# Different base:
|
||||||
self.assertEqual(int("10",16), 16)
|
self.assertEqual(int("10",16), 16)
|
||||||
# Test conversion from strings and various anomalies
|
# Test conversion from strings and various anomalies
|
||||||
for s, v in L:
|
# Testing with no sign at front
|
||||||
for sign in "", "+", "-":
|
for s, v in test_conv_no_sign:
|
||||||
|
for prefix in "", " ", "\t", " \t\t ":
|
||||||
|
ss = prefix + s
|
||||||
|
vv = v
|
||||||
|
try:
|
||||||
|
self.assertEqual(int(ss), vv)
|
||||||
|
except v:
|
||||||
|
pass
|
||||||
|
# No whitespaces allowed between + or - sign and the number
|
||||||
|
for s, v in test_conv_sign:
|
||||||
|
for sign in "+", "-":
|
||||||
for prefix in "", " ", "\t", " \t\t ":
|
for prefix in "", " ", "\t", " \t\t ":
|
||||||
ss = prefix + sign + s
|
ss = prefix + sign + s
|
||||||
vv = v
|
vv = v
|
||||||
|
|
|
@ -12,6 +12,8 @@ What's New in Python 3.0a3?
|
||||||
Core and Builtins
|
Core and Builtins
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
- Issue #1769: Now int("- 1") is not allowed any more.
|
||||||
|
|
||||||
- Object/longobject.c: long(float('nan')) raises an OverflowError instead
|
- Object/longobject.c: long(float('nan')) raises an OverflowError instead
|
||||||
of returning 0.
|
of returning 0.
|
||||||
|
|
||||||
|
|
|
@ -1685,8 +1685,6 @@ PyLong_FromString(char *str, char **pend, int base)
|
||||||
++str;
|
++str;
|
||||||
sign = -1;
|
sign = -1;
|
||||||
}
|
}
|
||||||
while (*str != '\0' && isspace(Py_CHARMASK(*str)))
|
|
||||||
str++;
|
|
||||||
if (base == 0) {
|
if (base == 0) {
|
||||||
if (str[0] != '0')
|
if (str[0] != '0')
|
||||||
base = 10;
|
base = 10;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue