[capi-sig] Weakref callbacks

Campbell Barton cbarton at metavr.com
Sun Aug 5 09:38:36 CEST 2007


Hi, recently I needed to use weakrefs and found them a bit awkward 
because they need to accept a python function when that function is 
(usually/always?) a C function.

Heres an example of a weakref callback in C...

Anyone know if theres a nicer way to use PyCFunction_New, rather then 
define a PyMethodDef beforehand?

Id prefer if you could just pass the C function as the weakref callback, 
perhaps it would be possible to have an alternate PyWeakref_NewProxy 
function that accepted a C function as a callback.


heres the weakref callback method I used....
_________

/* c function*/
PyObject * arm_weakref_callback_weakref_dealloc(PyObject *self, PyObject 
*weakref);
/* python callable */
PyObject * arm_weakref_callback_weakref_dealloc__pyfunc;




/* internal func to remove weakref from weakref list */
PyObject * arm_weakref_callback_weakref_dealloc(PyObject *self, PyObject 
*weakref)
{
	char *list_name = ARM_WEAKREF_LIST_NAME;
	PyObject *maindict = NULL, *armlist = NULL;
	int i;
	/* error checking below removed */
	maindict= PyModule_GetDict(PyImport_AddModule(	"__main__"));
	armlist = PyDict_GetItemString(maindict, list_name);
	i = PySequence_Index(armlist, weakref);
	PySequence_DelItem(armlist, i);
	Py_RETURN_NONE;
}


PyObject *Armature_CreatePyObject(struct bArmature *armature)
{

	/* snip----- */	

	weakref = PyWeakref_NewProxy((PyObject*)py_armature, 
arm_weakref_callback_weakref_dealloc__pyfunc);

	/* snip----- */	
	return (PyObject *) py_armature;

}


/* internal use only */
static PyMethodDef bpy_arm_weakref_callback_weakref_dealloc[] = {
	{"arm_weakref_callback_weakref_dealloc", 
arm_weakref_callback_weakref_dealloc, METH_O, ""}
};


//-------------------MODULE INITIALIZATION--------------------------------
PyObject *Armature_Init(void)
{
	/* snip----- */	
	arm_weakref_callback_weakref_dealloc__pyfunc = 
PyCFunction_New(bpy_arm_weakref_callback_weakref_dealloc, NULL);
	/* snip----- */	

}

-- 
Campbell J Barton (ideasman42)


More information about the capi-sig mailing list