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, noINCREF
oDECREF
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;
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.
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.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 tú 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.
No estoy bastante seguro que entiendo esto, pero esta es más una pregunta relacionada con C. ¿Cómo se agrega un
int
odouble
a un objeto Python?¿Puedes dar un ejemplo donde ese método no funcionará?
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.
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