Issue #2844: Make int('42', n) consistently raise ValueError for

invalid integers n (including n = -909).
This commit is contained in:
Mark Dickinson 2010-05-26 20:07:58 +00:00
parent d5442cd37a
commit f9a5a8e0af
3 changed files with 33 additions and 9 deletions

View File

@ -345,6 +345,16 @@ class LongTest(unittest.TestCase):
self.assertRaises(ValueError, int, '08', 0) self.assertRaises(ValueError, int, '08', 0)
self.assertRaises(ValueError, int, '-012395', 0) self.assertRaises(ValueError, int, '-012395', 0)
# invalid bases
invalid_bases = [-909,
2**31-1, 2**31, -2**31, -2**31-1,
2**63-1, 2**63, -2**63, -2**63-1,
2**100, -2**100,
]
for base in invalid_bases:
self.assertRaises(ValueError, int, '42', base)
def test_conversion(self): def test_conversion(self):
class JustLong: class JustLong:

View File

@ -12,6 +12,9 @@ What's New in Python 3.2 Alpha 1?
Core and Builtins Core and Builtins
----------------- -----------------
- Issue #2844: Make int('42', n) consistently raise ValueError for
invalid integers n (including n = -909).
- Issue #8188: Introduce a new scheme for computing hashes of numbers - Issue #8188: Introduce a new scheme for computing hashes of numbers
(instances of int, float, complex, decimal.Decimal and (instances of int, float, complex, decimal.Decimal and
fractions.Fraction) that makes it easy to maintain the invariant fractions.Fraction) that makes it easy to maintain the invariant

View File

@ -4098,23 +4098,34 @@ long_subtype_new(PyTypeObject *type, PyObject *args, PyObject *kwds);
static PyObject * static PyObject *
long_new(PyTypeObject *type, PyObject *args, PyObject *kwds) long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
{ {
PyObject *x = NULL; PyObject *obase = NULL, *x = NULL;
int base = -909; /* unlikely! */ long base;
int overflow;
static char *kwlist[] = {"x", "base", 0}; static char *kwlist[] = {"x", "base", 0};
if (type != &PyLong_Type) if (type != &PyLong_Type)
return long_subtype_new(type, args, kwds); /* Wimp out */ return long_subtype_new(type, args, kwds); /* Wimp out */
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist, if (!PyArg_ParseTupleAndKeywords(args, kwds, "|OO:int", kwlist,
&x, &base)) &x, &obase))
return NULL; return NULL;
if (x == NULL) if (x == NULL)
return PyLong_FromLong(0L); return PyLong_FromLong(0L);
if (base == -909) if (obase == NULL)
return PyNumber_Long(x); return PyNumber_Long(x);
else if (PyUnicode_Check(x))
base = PyLong_AsLongAndOverflow(obase, &overflow);
if (base == -1 && PyErr_Occurred())
return NULL;
if (overflow || (base != 0 && base < 2) || base > 36) {
PyErr_SetString(PyExc_ValueError,
"int() arg 2 must be >= 2 and <= 36");
return NULL;
}
if (PyUnicode_Check(x))
return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x), return PyLong_FromUnicode(PyUnicode_AS_UNICODE(x),
PyUnicode_GET_SIZE(x), PyUnicode_GET_SIZE(x),
base); (int)base);
else if (PyByteArray_Check(x) || PyBytes_Check(x)) { else if (PyByteArray_Check(x) || PyBytes_Check(x)) {
/* Since PyLong_FromString doesn't have a length parameter, /* Since PyLong_FromString doesn't have a length parameter,
* check here for possible NULs in the string. */ * check here for possible NULs in the string. */
@ -4129,10 +4140,10 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
x is a bytes or buffer, *and* a base is given. */ x is a bytes or buffer, *and* a base is given. */
PyErr_Format(PyExc_ValueError, PyErr_Format(PyExc_ValueError,
"invalid literal for int() with base %d: %R", "invalid literal for int() with base %d: %R",
base, x); (int)base, x);
return NULL; return NULL;
} }
return PyLong_FromString(string, NULL, base); return PyLong_FromString(string, NULL, (int)base);
} }
else { else {
PyErr_SetString(PyExc_TypeError, PyErr_SetString(PyExc_TypeError,