Describe CAPI CookBook here.
Functions for returning an error with one call
PyObject *EXPP_ReturnPyObjError( PyObject * type, char *error_msg )
{ /* same as above, just to change its name smoothly */
PyErr_SetString( type, error_msg );
return NULL;
}int EXPP_ReturnIntError( PyObject * type, char *error_msg )
{
PyErr_SetString( type, error_msg );
return -1;
}
Return in incremented reference
PyObject *EXPP_incr_ret( PyObject * object )
{
Py_INCREF( object );
return ( object );
}
Check sequence type
/*****************************************************************************/
/* Description: Checks whether all objects in a PySequence are of a same */
/* given type. Returns 0 if not, 1 on success. */
/*****************************************************************************/
int EXPP_check_sequence_consistency( PyObject * seq, PyTypeObject * against )
{
PyObject *ob;
int len = PySequence_Length( seq );
int i, result = 1;
for( i = 0; i < len; i++ ) {
ob = PySequence_GetItem( seq, i );
if( ob == Py_None )
result = 2;
else if( ob->ob_type != against ) {
Py_DECREF( ob );
return 0;
}
Py_DECREF( ob );
}
return result; /* 1 if all of 'against' type, 2 if there are (also) Nones */
}
Tuple Prepend
/*
* Helper function for subtypes that use the base types methods.
* The command below needs to have args modified to have 'self' added at the start
* ret = PyObject_Call(PyDict_GetItemString(PyList_Type.tp_dict, "sort"), args, keywds);
*
* This is not easy with the python API so adding a function here,
* remember to Py_DECREF the tuple after
*/
PyObject * EXPP_PyTuple_New_Prepend(PyObject *tuple, PyObject *value)
{
PyObject *item;
PyObject *new_tuple;
int i;
i = PyTuple_Size(tuple);
new_tuple = PyTuple_New(i+1);
PyTuple_SetItem(new_tuple, 0, value);
Py_INCREF(value);
while (i) {
i--;
item = PyTuple_GetItem(tuple, i);
PyTuple_SetItem(new_tuple, i+1, item);
Py_INCREF(item);
}
return new_tuple;
}
Methods into dictionary
/* this function adds methods to a dictionary.
* in cases where the methods do not go into a module as is useual
* - for instance if you want to add methods to a type
*/
void EXPP_PyMethodsToDict(PyObject *dict, struct PyMethodDef *meth)
{
PyObject *value;
while (meth->ml_name) {
value = PyCFunction_New(meth, NULL);
PyDict_SetItemString(dict, meth->ml_name, value);
Py_DECREF(value);
meth++;
}
}
Anonymous Pointer Comparison
add to the header...
/* for anonymous comparisons */
typedef struct {
PyObject_HEAD
void * pointer;
} BPyAnonymousObject;comparison function...
/*
* This is to compare any 2 types that have a pointer directly after the
* PyObject in their struct, this covers quite a few.
* */
int EXPP_Anonymous_compare( BPyAnonymousObject * a, BPyAnonymousObject * b )
{
return ( a->pointer == b->pointer) ? 0 : -1;
}