summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlex Martelli <aleaxit@gmail.com>2007-08-22 22:39:42 (GMT)
committerAlex Martelli <aleaxit@gmail.com>2007-08-22 22:39:42 (GMT)
commit86d8b3497fb509d1c52f6f29f74854ec96987f23 (patch)
treef7224a765686a781615ff73e3393f6bd106e1171
parenta62b45c95daa1172c7411062372f0cc3827a292f (diff)
downloadcpython-86d8b3497fb509d1c52f6f29f74854ec96987f23.zip
cpython-86d8b3497fb509d1c52f6f29f74854ec96987f23.tar.gz
cpython-86d8b3497fb509d1c52f6f29f74854ec96987f23.tar.bz2
Implement the trunc builtin for PEP 3141
-rw-r--r--Lib/test/test_builtin.py14
-rw-r--r--Python/bltinmodule.c22
2 files changed, 36 insertions, 0 deletions
diff --git a/Lib/test/test_builtin.py b/Lib/test/test_builtin.py
index b3e4733..d5fc85f 100644
--- a/Lib/test/test_builtin.py
+++ b/Lib/test/test_builtin.py
@@ -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)
diff --git a/Python/bltinmodule.c b/Python/bltinmodule.c
index ce8b7f5..2c163a1 100644
--- a/Python/bltinmodule.c
+++ b/Python/bltinmodule.c
@@ -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},
};