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:
Facundo Batista 2008-01-19 19:12:01 +00:00
parent 587c2bfede
commit 2336bddd5d
3 changed files with 37 additions and 5 deletions

View File

@ -49,7 +49,7 @@ class BitBucket:
def write(self, line):
pass
L = [
test_conv_no_sign = [
('0', 0),
('1', 1),
('9', 9),
@ -71,6 +71,28 @@ L = [
(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:
def __bool__(self):
raise RuntimeError
@ -641,8 +663,18 @@ class BuiltinTest(unittest.TestCase):
# Different base:
self.assertEqual(int("10",16), 16)
# Test conversion from strings and various anomalies
for s, v in L:
for sign in "", "+", "-":
# Testing with no sign at front
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 ":
ss = prefix + sign + s
vv = v

View File

@ -12,6 +12,8 @@ What's New in Python 3.0a3?
Core and Builtins
-----------------
- Issue #1769: Now int("- 1") is not allowed any more.
- Object/longobject.c: long(float('nan')) raises an OverflowError instead
of returning 0.

View File

@ -1685,8 +1685,6 @@ PyLong_FromString(char *str, char **pend, int base)
++str;
sign = -1;
}
while (*str != '\0' && isspace(Py_CHARMASK(*str)))
str++;
if (base == 0) {
if (str[0] != '0')
base = 10;