Rouslan Korneychuk, 03.07.2010 19:22:
The code also never uses PyArg_ParseTuple or its variants. It converts every argument using the appropriate PyX_FromY functions. I noticed PyBindGen does the following when a conversion is needed for one argument:py_retval = Py_BuildValue((char *) "(O)", value); if (!PyArg_ParseTuple(py_retval, (char *) "i", &self->obj->y)) { Py_DECREF(py_retval); return -1; } Py_DECREF(py_retval); On the other hand, here's the implementation for __sequence__getitem__: PyObject * obj_DVector___sequence__getitem__(obj_DVector *self,Py_ssize_t index) { try { std::vector<double,std::allocator<double> > &base = cast_base_DVector(reinterpret_cast<PyObject*>(self)); return PyFloat_FromDouble(base.at(py_ssize_t_to_ulong(index))); } EXCEPT_HANDLERS(0) }
Check the code that Cython uses for these things. It generates specialised type conversion code that has received a lot of careful benchmarking and testing on different platforms.
Stefan -- http://mail.python.org/mailman/listinfo/python-list
