PyObject_SetAttrString - doesn't set instance attribute
Carl Banks
pavlovevidence at gmail.com
Sun May 2 05:52:13 EDT 2010
On May 1, 4:04 am, Jason <jason.hee... at gmail.com> wrote:
> I'm having a bit of trouble with C/Python bindings. Particularly,
> trying to set an instance variable from C when the object is
> initialised using PyObject_SetAttrString, but nothing seems to happen.
> The C initialisation code is:
>
> static void
> nautilus_python_object_instance_init (NautilusPythonObject *object)
> {
>
> fprintf(stderr, "nautilus_python_object_instance_init called\n");
>
> NautilusPythonObjectClass *class;
> debug_enter();
>
> class = (NautilusPythonObjectClass*)(((GTypeInstance*)object)-
>
> >g_class);
>
> object->instance = PyObject_CallObject(class->type, NULL);
>
> PyObject* test_int = PyInt_FromLong(42);
>
> if (object->instance == NULL)
> {
> PyErr_Print();
> }
> else
> {
> fprintf(stderr, "Setting magic parameter\n");
> fprintf(stderr, "From C: ");
> PyObject_Print(object->instance, stderr, 0);
> fprintf(stderr, "\n");
> int retval = PyObject_SetAttrString(object->instance,
> "super_happy_magic", test_int);
> fprintf(stderr, "Result: %i\n", retval);
> }
>
> Py_DECREF(test_int);
>
> }
Not sure what you're doing here. It looks like you are being passed
an object of a given type, then you get the type object, call it to
create another object of that type, and assign it to object->instance.
> ...and the Python module contains:
>
> class MenuProviderTest(nautilus.MenuProvider):
>
> def __init__(self):
> print "From Python: %s" % self
>
> try:
> print getattr(self, "super_happy_magic")
> except AttributeError:
> print "Didn't work!"
>
> When the MenuProviderTest is created, the output is:
>
> nautilus_python_object_instance_init called
> Setting magic parameter
> From C: <MenuProvTest.MenuProviderTest object at 0x7faee6a9fcd0>
> Result: 0
> From Python: <MenuProvTest.MenuProviderTest object at 0x7faee6a9fcd0>
> Didn't work!
>
> (I've tried getattr and self.super_happy_magic, with the same effect.)
>
> Where am I going wrong?
You are assigning the attirbute the the object that the C code refers
to as "object->instance", but it seems that in the Python snippet you
are calling getattr on the object that the C code refers to as
"object".
Carl Banks
More information about the Python-list
mailing list