C API: Change immutable objects? :-o

Frank Sonnenburg frank.sonnenburg at biosolveit.de
Fri Aug 2 17:52:07 CEST 2002


Hi there

I'm trying to speed up updating my PyObjects, e.g. PyFloat.

So instead of deleting the old object and creating a new one with my new 
double value, i over-write the old value in the PyFloatObject-struct:

========================================================================
#include "python/Python.h"
#include <stdlib.h>

PyObject *change_float(PyObject *self, PyObject *args)
{
  PyObject *pyval;

  if (!PyArg_ParseTuple(args, "O!", &PyFloat_Type, &pyval))
    return NULL;

  /* over-write old value */
  /************************/
  ((PyFloatObject *) pyval)->ob_fval = 3.14159;

  return Py_BuildValue("");
}

PyMethodDef methods[] = {
  {"change_float", change_float, METH_VARARGS},
  {NULL, NULL}
};

void initnewmodule(void)
{
  Py_InitModule("newmodule", methods);
}
========================================================================


Executing is fine, as desired:


>>> import newmodule
>>> f=3.0
>>> newmodule.change_float(f)
>>> f
3.1415899999999999



But maybe this is very risky i assume?? If this would be all right, there 
would have been an explicit API-call!?

I'm very afraid in using this because handling for example integers in this 
manner would cause serious problems in some circumstances. Small integer 
objects are predefined and changing their values would have unpredictable 
consequences.

Are there some cases, where proceeding as described is not dangerous? Or do 
you say: NEVER, you will always get trouble with this!?


Thanks in advance

Frank



More information about the Python-list mailing list