add Py3k warnings to oct and hex. backport hex behavior (because it's not different)
This commit is contained in:
parent
6c90c9faae
commit
79a922d6df
|
@ -632,6 +632,10 @@ class BuiltinTest(unittest.TestCase):
|
|||
self.assertEqual(hex(-16L), '-0x10L')
|
||||
self.assertRaises(TypeError, hex, {})
|
||||
|
||||
class Spam(object):
|
||||
def __index__(self): return 23
|
||||
self.assertEqual(hex(Spam()), "0x17")
|
||||
|
||||
def test_id(self):
|
||||
id(None)
|
||||
id(1)
|
||||
|
|
|
@ -123,6 +123,20 @@ class TestPy3KWarnings(unittest.TestCase):
|
|||
with catch_warning() as w:
|
||||
self.assertWarning(buffer('a'), w, expected)
|
||||
|
||||
def test_hex_and_oct(self):
|
||||
class Spam(object):
|
||||
def __hex__(self): return "0x17"
|
||||
def __oct__(self): return "07"
|
||||
|
||||
expected = 'In 3.x, oct() converts the result of __index__ to octal; ' \
|
||||
'Use future_builtins.oct for this behavior. ' \
|
||||
'Also, note the returned format is different.'
|
||||
with catch_warning() as w:
|
||||
self.assertWarning(oct(Spam()), w, expected)
|
||||
expected = 'In 3.x, hex() converts the result of __index__ to hexidecimal.'
|
||||
with catch_warning() as w:
|
||||
self.assertWarning(hex(Spam()), w, expected)
|
||||
|
||||
|
||||
class TestStdlibRemovals(unittest.TestCase):
|
||||
|
||||
|
|
|
@ -1181,22 +1181,29 @@ builtin_hex(PyObject *self, PyObject *v)
|
|||
{
|
||||
PyNumberMethods *nb;
|
||||
PyObject *res;
|
||||
|
||||
if ((nb = v->ob_type->tp_as_number) == NULL ||
|
||||
nb->nb_hex == NULL) {
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"hex() argument can't be converted to hex");
|
||||
return NULL;
|
||||
|
||||
nb = Py_TYPE(v)->tp_as_number;
|
||||
|
||||
if (nb != NULL && nb->nb_hex != NULL) {
|
||||
if (PyErr_WarnPy3k("In 3.x, hex() converts "
|
||||
"the result of __index__ to hexidecimal.",
|
||||
1) < 0)
|
||||
return NULL;
|
||||
res = (*nb->nb_hex)(v);
|
||||
if (res && !PyString_Check(res)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"__hex__ returned non-string (type %.200s)",
|
||||
res->ob_type->tp_name);
|
||||
Py_DECREF(res);
|
||||
return NULL;
|
||||
}
|
||||
return res;
|
||||
}
|
||||
res = (*nb->nb_hex)(v);
|
||||
if (res && !PyString_Check(res)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
"__hex__ returned non-string (type %.200s)",
|
||||
res->ob_type->tp_name);
|
||||
Py_DECREF(res);
|
||||
return NULL;
|
||||
}
|
||||
return res;
|
||||
else if (PyIndex_Check(v))
|
||||
return PyNumber_ToBase(v, 16);
|
||||
PyErr_SetString(PyExc_TypeError,
|
||||
"hex() argument can't be converted to hex");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(hex_doc,
|
||||
|
@ -1456,6 +1463,11 @@ builtin_oct(PyObject *self, PyObject *v)
|
|||
"oct() argument can't be converted to oct");
|
||||
return NULL;
|
||||
}
|
||||
if (PyErr_WarnPy3k("In 3.x, oct() converts the result of __index__ to octal; "
|
||||
"Use future_builtins.oct for this behavior. "
|
||||
"Also, note the returned format is different.",
|
||||
1) < 0)
|
||||
return NULL;
|
||||
res = (*nb->nb_oct)(v);
|
||||
if (res && !PyString_Check(res)) {
|
||||
PyErr_Format(PyExc_TypeError,
|
||||
|
|
Loading…
Reference in New Issue