Py INCREF / DECREF: Cuando


Es uno correcto al afirmar lo siguiente:

  • Si se crea un objeto Python en una función C, pero la función no lo devuelve, no se necesita INCREF, pero sí DECREF.

  • [false] Si la función lo devuelve, necesita INCREF, en la función que recibe el valor devuelto.[/false]

  • Al asignar variables de tipo C como atributos, como double, int etc., al objeto Python, no INCREF o DECREF es necesario.

  • Asignar objetos Python como atributos a tus otros objetos Python es así:

    PyObject *foo;
    foo = bar // A Python object
    tmp = self->foo;
    Py_INCREF(foo);
    self->foo = foo;
    Py_XDECREF(tmp);
    //taken from the manual, but it is unclear if this works in every situation
    

EDITAR: } > ¿puedo usar esto con seguridad en cada situación? (no me he encontrado con uno donde me causó problemas)

  • dealloc de un objeto Python necesita DECREF para cualquier otro objeto Python que tenga como atributo, pero no para atributos que sean tipos C.

Editar

Con el tipo ' C como un atributo ' Me refiero a bar y baz:

typedef struct {
    PyObject_HEAD
    PyObject *foo;
    int bar;
    double baz;
} FooBarBaz;
Author: Ethan Furman, 2011-01-11

1 answers

Primero, lea esto con más cuidado, específicamente el último párrafo, http://docs.python.org/extending/extending.html#ownership-rules

Una manera fácil de pensar en ello es pensar en los recuentos de referencia.

  1. Su primera declaración es correcta. Si crea un nuevo objeto Python (por ejemplo PyLong), entonces ya tiene un recuento de referencia de 1. Esto está bien si lo vas a devolver, pero si no lo vas a devolver, necesita ser basura recolectada por Python y solo está marcado para GC con refcount = 0, por lo que necesita DECREF si no va a devolverlo.

  2. La segunda afirmación es falsa. Si necesita devolverlo y lo creó, simplemente devuélvalo. La devolución transfiere la propiedad. Si tuvieras que INCREMENTAR antes de regresar, entonces le estás diciendo a Python que también estás reteniendo una copia. Así que de nuevo, si lo creas, refcount=1. Si luego haces INCREF entonces refcount = 2. Pero esto es no lo que quieres, tú desea volver con refcount = 1.

  3. No estoy bastante seguro que entiendo esto, pero esta es más una pregunta relacionada con C. ¿Cómo se agrega un int o double a un objeto Python?

  4. ¿Puedes dar un ejemplo donde ese método no funcionará?

  5. De nuevo, no estoy seguro cuando un tipo C es un atributo de un objeto Python. Cada int, double, long, etc. está envuelto por un objeto Python de una manera u otra.

Las advertencias a estos las respuestas se describen en el enlace anterior. Realmente no deberías necesitar mi pobre explicación después de leer eso. Espero haber aclarado y no confundir más.

 39
Author: milkypostman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-01-11 15:22:45