]> granicus.if.org Git - python/commitdiff
add Py3k warnings to oct and hex. backport hex behavior (because it's not different)
authorBenjamin Peterson <benjamin@python.org>
Sat, 17 May 2008 19:21:20 +0000 (19:21 +0000)
committerBenjamin Peterson <benjamin@python.org>
Sat, 17 May 2008 19:21:20 +0000 (19:21 +0000)
Lib/test/test_builtin.py
Lib/test/test_py3kwarn.py
Python/bltinmodule.c

index 15d80a369831dc35a384844e57d94410a1e426d8..4264a9915ddaea1860ef4a14e2c40492e27295dd 100644 (file)
@@ -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)
index 2c8f509e605b0b92f755b27c73d641af8cee34f8..e6d38f2ca746d0279c626f607d2f3d7d364c5ce0 100644 (file)
@@ -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):
 
index 0234b6bd809f66e8451d956ae1810499c4592ee4..5c30e03fcf0ee5a24db11318d1aff87d27162a12 100644 (file)
@@ -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;
-       }
-       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;
+       
+       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;
        }
-       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,