Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

196
Visualizações
¿Es necesario liberar algunos recursos asignados por la API de Python C?

Tengo el siguiente código C que llama a la biblioteca API de Python:

 PyObject *obj; PyObject *arguments; arguments = PyTuple_New(2); PyTuple_SetItem(arguments, 0, PyLong_FromLongLong(10)); PyTuple_SetItem(arguments, 1, PyLong_FromLongLong(20)); obj = PyObject_CallObject(my_function, arguments); // should "obj" be released after being used? PyLong_AsLongLong(obj); Py_DECREF(arguments); // is this instruction necessary?

Tengo dos preguntas (ambas están en el código como comentarios), a saber: 1) ¿debería liberarse la variable obj después de usarla (en caso afirmativo, cómo se hace esto?) y 2) ¿necesitamos disminuir el contador de referencia de la variable? arguments (es decir, ¿necesitamos Py_DECREF(arguments); )? ¡Gracias por toda la ayuda de antemano!

over 4 years ago · Santiago Trujillo
1 Respostas
Responde à pergunta

0

Debe leer https://docs.python.org/3/c-api/intro.html#objects-types-and-reference-counts , que describe la forma correcta de manejar el recuento de referencias con la API de Python C. Siguiendo las reglas allí descritas, el código correcto para tu situación sería el siguiente.

 PyObject *obj; PyObject *arguments; arguments = PyTuple_New(2); // this returns a new reference // You don't need to Py_DECREF() the return values of PyLong_FromLongLong() // because PyTuple_SetItem() steals a reference. PyTuple_SetItem(arguments, 0, PyLong_FromLongLong(10)); PyTuple_SetItem(arguments, 1, PyLong_FromLongLong(20)); obj = PyObject_CallObject(my_function, arguments); // this returns a new reference PyLong_AsLongLong(obj); Py_DECREF(arguments); // this is necessary because a new reference was created earlier Py_DECREF(obj); // this is necessary because a new reference was created earlier

Tenga en cuenta que no he agregado ninguna verificación de errores. Algunas de estas funciones pueden devolver NULL en caso de error, por lo que sería conveniente verificarlas.

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda