Kaydet (Commit) 79a922d6 authored tarafından Benjamin Peterson's avatar Benjamin Peterson

add Py3k warnings to oct and hex. backport hex behavior (because it's not different)

üst 6c90c9fa
...@@ -632,6 +632,10 @@ class BuiltinTest(unittest.TestCase): ...@@ -632,6 +632,10 @@ class BuiltinTest(unittest.TestCase):
self.assertEqual(hex(-16L), '-0x10L') self.assertEqual(hex(-16L), '-0x10L')
self.assertRaises(TypeError, hex, {}) self.assertRaises(TypeError, hex, {})
class Spam(object):
def __index__(self): return 23
self.assertEqual(hex(Spam()), "0x17")
def test_id(self): def test_id(self):
id(None) id(None)
id(1) id(1)
......
...@@ -123,6 +123,20 @@ class TestPy3KWarnings(unittest.TestCase): ...@@ -123,6 +123,20 @@ class TestPy3KWarnings(unittest.TestCase):
with catch_warning() as w: with catch_warning() as w:
self.assertWarning(buffer('a'), w, expected) 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): class TestStdlibRemovals(unittest.TestCase):
......
...@@ -1181,22 +1181,29 @@ builtin_hex(PyObject *self, PyObject *v) ...@@ -1181,22 +1181,29 @@ builtin_hex(PyObject *self, PyObject *v)
{ {
PyNumberMethods *nb; PyNumberMethods *nb;
PyObject *res; PyObject *res;
if ((nb = v->ob_type->tp_as_number) == NULL || nb = Py_TYPE(v)->tp_as_number;
nb->nb_hex == NULL) {
PyErr_SetString(PyExc_TypeError, if (nb != NULL && nb->nb_hex != NULL) {
"hex() argument can't be converted to hex"); if (PyErr_WarnPy3k("In 3.x, hex() converts "
return NULL; "the result of __index__ to hexidecimal.",
} 1) < 0)
res = (*nb->nb_hex)(v); return NULL;
if (res && !PyString_Check(res)) { res = (*nb->nb_hex)(v);
PyErr_Format(PyExc_TypeError, if (res && !PyString_Check(res)) {
"__hex__ returned non-string (type %.200s)", PyErr_Format(PyExc_TypeError,
res->ob_type->tp_name); "__hex__ returned non-string (type %.200s)",
Py_DECREF(res); res->ob_type->tp_name);
return NULL; Py_DECREF(res);
return NULL;
}
return res;
} }
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, PyDoc_STRVAR(hex_doc,
...@@ -1456,6 +1463,11 @@ builtin_oct(PyObject *self, PyObject *v) ...@@ -1456,6 +1463,11 @@ builtin_oct(PyObject *self, PyObject *v)
"oct() argument can't be converted to oct"); "oct() argument can't be converted to oct");
return NULL; 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); res = (*nb->nb_oct)(v);
if (res && !PyString_Check(res)) { if (res && !PyString_Check(res)) {
PyErr_Format(PyExc_TypeError, PyErr_Format(PyExc_TypeError,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment