python extension: incref question

John Hunter jdhunter at ace.bsd.uchicago.edu
Sun Feb 22 12:17:53 EST 2004


I am writing a python extension and have a question about reference
counting on an attribute I set.  I am using standard boilerplate code
for defining a new type.

I implement the setattr methods, and want to set some numeric values
from within the extension code.  I create the new GlyphObject and set
the attributes with

  GlyphObject *gm;
  gm = PyObject_New(GlyphObject, &Glyph_Type);
  //handle error  
  gm->x_attr = NULL;
  Glyph_setattr(gm, "width", PyInt_FromLong(self->face->glyph->metrics.width));
  Glyph_setattr(gm, "height", PyInt_FromLong(self->face->glyph->metrics.height));

where

static int
Glyph_setattr(GlyphObject *self, char *name, PyObject *v)
{
  if (self->x_attr == NULL) {
    self->x_attr = PyDict_New();
    if (self->x_attr == NULL)
      return -1;
  }

  if (v == NULL) {
    int rv = PyDict_DelItemString(self->x_attr, name);
    if (rv < 0)
      PyErr_SetString(PyExc_AttributeError,
		      "delete non-existing Glyph attribute");
    return rv;
  }
  else {
    return PyDict_SetItemString(self->x_attr, name, v);
  }
}

http://www.python.org/doc/current/ext/ownershipRules.html states

  PyDict_SetItem() and friends don't take over ownership -- they are
  ``normal.''

I infer from this that since a new ref is created by PyInt_FromLong,
and PyDict_SetItemString doesn't take ownership, that I should
decrease the reference count in my types dealloc function.  Is this
correct?

Thanks,
John Hunter




More information about the Python-list mailing list