]> granicus.if.org Git - python/commitdiff
Implement the trunc builtin for PEP 3141
authorAlex Martelli <aleaxit@gmail.com>
Wed, 22 Aug 2007 22:39:42 +0000 (22:39 +0000)
committerAlex Martelli <aleaxit@gmail.com>
Wed, 22 Aug 2007 22:39:42 +0000 (22:39 +0000)
Lib/test/test_builtin.py
Python/bltinmodule.c

index b3e47338041bbfa738eac9496d429982d8f16117..d5fc85fe3e8b2f64b950f79192a096ff918eceb8 100644 (file)
@@ -1515,6 +1515,20 @@ class BuiltinTest(unittest.TestCase):
                 raise ValueError
         self.assertRaises(ValueError, sum, BadSeq())
 
+    def test_trunc(self):
+        class TestTrunc:
+            def __trunc__(self):
+                return 23
+
+        class TestNoTrunc:
+            pass
+
+        self.assertEqual(trunc(TestTrunc()), 23)
+
+        self.assertRaises(TypeError, trunc)
+        self.assertRaises(TypeError, trunc, 1, 2)
+        self.assertRaises(TypeError, trunc, TestNoTrunc())
+
     def test_tuple(self):
         self.assertEqual(tuple(()), ())
         t0_3 = (0, 1, 2, 3)
index ce8b7f50b1b1178f9d35d6575e03ce336be24cd0..2c163a16e859c2fbb023819fbb9ad4594559d7cb 100644 (file)
@@ -1486,6 +1486,27 @@ PyDoc_STRVAR(vars_doc,
 Without arguments, equivalent to locals().\n\
 With an argument, equivalent to object.__dict__.");
 
+static PyObject *
+builtin_trunc(PyObject *self, PyObject *v)
+{
+       PyObject *res;
+       PyObject *d = PyObject_GetAttrString(v, "__trunc__");
+       if (d == NULL) {
+               PyErr_SetString(PyExc_TypeError,
+                   "trunc() argument must have __trunc__ attribute");
+               return NULL;
+       }
+       res = PyObject_CallFunction(d, "");
+       Py_DECREF(d);
+       return res;
+}
+
+PyDoc_STRVAR(trunc_doc,
+"trunc(Real) -> Integral\n\
+\n\
+returns the integral closest to x between 0 and x.");
+
+
 
 static PyObject*
 builtin_sum(PyObject *self, PyObject *args)
@@ -1659,6 +1680,7 @@ static PyMethodDef builtin_methods[] = {
        {"sorted",      (PyCFunction)builtin_sorted,     METH_VARARGS | METH_KEYWORDS, sorted_doc},
        {"sum",         builtin_sum,        METH_VARARGS, sum_doc},
        {"vars",        builtin_vars,       METH_VARARGS, vars_doc},
+       {"trunc",       builtin_trunc,      METH_O, trunc_doc},
        {"zip",         builtin_zip,        METH_VARARGS, zip_doc},
        {NULL,          NULL},
 };