diff options
author | Alex Martelli <aleaxit@gmail.com> | 2007-08-22 22:39:42 (GMT) |
---|---|---|
committer | Alex Martelli <aleaxit@gmail.com> | 2007-08-22 22:39:42 (GMT) |
commit | 86d8b3497fb509d1c52f6f29f74854ec96987f23 (patch) | |
tree | f7224a765686a781615ff73e3393f6bd106e1171 | |
parent | a62b45c95daa1172c7411062372f0cc3827a292f (diff) | |
download | cpython-86d8b3497fb509d1c52f6f29f74854ec96987f23.zip cpython-86d8b3497fb509d1c52f6f29f74854ec96987f23.tar.gz cpython-86d8b3497fb509d1c52f6f29f74854ec96987f23.tar.bz2 |
Implement the trunc builtin for PEP 3141
-rw-r--r-- | Lib/test/test_builtin.py | 14 | ||||
-rw-r--r-- | Python/bltinmodule.c | 22 |
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}, }; |