Issue #16761: Raise TypeError when int() or long() called with base argument only.

This commit is contained in:
Serhiy Storchaka 2012-12-28 09:31:59 +02:00
parent 3684c79e00
commit cf095f8e0f
4 changed files with 19 additions and 14 deletions

View File

@ -60,6 +60,8 @@ class IntLongCommonTests(object):
self.assertEqual(self.ntype(x=1.2), 1)
self.assertEqual(self.ntype('100', base=2), 4)
self.assertEqual(self.ntype(x='100', base=2), 4)
self.assertRaises(TypeError, self.ntype, base=10)
self.assertRaises(TypeError, self.ntype, base=0)
class IntTestCases(IntLongCommonTests, unittest.TestCase):
@ -365,18 +367,6 @@ class IntTestCases(IntLongCommonTests, unittest.TestCase):
def test_error_on_string_base(self):
self.assertRaises(TypeError, int, 100, base='foo')
# Include the following because in contrast CPython raises no error
# for bad integer bases when x is not given.
self.assertRaises(TypeError, int, base='foo')
# For example, PyPy 1.9.0 raised TypeError for these cases because it
# expects x to be a string if base is given.
@test_support.cpython_only
def test_int_base_without_x_returns_0(self):
self.assertEqual(int(base=6), 0)
# Even invalid bases don't raise an exception.
self.assertEqual(int(base=1), 0)
self.assertEqual(int(base=1000), 0)
@test_support.cpython_only
def test_small_ints(self):

View File

@ -9,6 +9,9 @@ What's New in Python 2.7.4
Core and Builtins
-----------------
- Issue #16761: Calling ``int()`` and ``long()`` with *base* argument only
now raises TypeError.
- Issue #16759: Support the full DWORD (unsigned long) range in Reg2Py
when retreiving a REG_DWORD value. This corrects functions like
winreg.QueryValueEx that may have been returning truncated values.

View File

@ -1059,8 +1059,14 @@ int_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:int", kwlist,
&x, &base))
return NULL;
if (x == NULL)
if (x == NULL) {
if (base != -909) {
PyErr_SetString(PyExc_TypeError,
"int() missing string argument");
return NULL;
}
return PyInt_FromLong(0L);
}
if (base == -909)
return PyNumber_Int(x);
if (PyString_Check(x)) {

View File

@ -3987,8 +3987,14 @@ long_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
if (!PyArg_ParseTupleAndKeywords(args, kwds, "|Oi:long", kwlist,
&x, &base))
return NULL;
if (x == NULL)
if (x == NULL) {
if (base != -909) {
PyErr_SetString(PyExc_TypeError,
"long() missing string argument");
return NULL;
}
return PyLong_FromLong(0L);
}
if (base == -909)
return PyNumber_Long(x);
else if (PyString_Check(x)) {