Author: alex.martelli
Date: Thu Aug 23 00:39:42 2007
New Revision: 57296

Modified:
   python/branches/py3k/Lib/test/test_builtin.py
   python/branches/py3k/Python/bltinmodule.c
Log:
Implement the trunc builtin for PEP 3141



Modified: python/branches/py3k/Lib/test/test_builtin.py
==============================================================================
--- python/branches/py3k/Lib/test/test_builtin.py       (original)
+++ python/branches/py3k/Lib/test/test_builtin.py       Thu Aug 23 00:39:42 2007
@@ -1515,6 +1515,20 @@
                 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)

Modified: python/branches/py3k/Python/bltinmodule.c
==============================================================================
--- python/branches/py3k/Python/bltinmodule.c   (original)
+++ python/branches/py3k/Python/bltinmodule.c   Thu Aug 23 00:39:42 2007
@@ -1486,6 +1486,27 @@
 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 @@
        {"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},
 };
_______________________________________________
Python-3000-checkins mailing list
[email protected]
http://mail.python.org/mailman/listinfo/python-3000-checkins

Reply via email to