2012-04-20 4 views
10

la convención estándar en el Python C-API es quePython funciones C-API que prestado y roban referencias

  • funciones no roban referencias de argumentos de entrada (que son objetos)

  • retorno valores y argumentos de salida (que son objetos) poseen una referencia

mayoría de las funciones en el Python C-API seguir esta convención. Sin embargo hay algunas excepciones. Me he encontrado lo siguiente:

funciones que roban una referencia a un argumento de entrada

PyModule_AddObject 

funciones con valores de retorno o argumentos de salida que se endeudan una referencia

PyErr_Occurred 
PyTuple_GetItem 
PyTuple_GETITEM 
PyDict_GetItem 
PyDict_GetItemString 
PyDict_Next 

Es hay una lista completa de tales funciones en cualquier lugar? Tal lista sería una referencia útil al escribir los módulos de extensión de Python.

+0

Esto parece una buena pregunta para los desarrolladores de Python. – phkahler

Respuesta

7

Una búsqueda de texto en los Python 2.7.2 docs C-API para las palabras "robar" y "tomar prestada" dio las siguientes listas:

funciones que roban una referencia de un argumento de entrada

PyCell_SET (but not PyCell_Set) 
PyList_SetItem, PyList_SET_ITEM 
PyModule_AddObject 
PyTuple_SetItem, PyTuple_SET_ITEM 

funciones con valores de retorno o argumentos de salida que piden prestado una referencia

all PyArg_Xxx functions 
PyCell_GET (but not PyCell_Get) 
PyDict_GetItem 
PyDict_GetItemString 
PyDict_Next 
PyErr_Occurred 
PyEval_GetBuiltins 
PyEval_GetFrame 
PyEval_GetGlobals 
PyEval_GetLocals 
PyFile_Name 
PyFunction_GetClosure 
PyFunction_GetCode 
PyFunction_GetDefaults 
PyFunction_GetGlobals 
PyFunction_GetModule 
PyImport_AddModule 
PyImport_GetModuleDict 
PyList_GetItem, PyList_GETITEM 
PyMethod_Class, PyMethod_GET_CLASS 
PyMethod_Function, PyMethod_GET_FUNCTION 
PyMethod_Self, PyMethod_GET_SELF 
PyModule_GetDict 
PyObject_Init 
PyObject_InitVar 
PySequence_Fast_GET_ITEM 
PySys_GetObject 
PyThreadState_GetDict 
PyTuple_GetItem, PyTuple_GET_ITEM 
PyWeakref_GetObject, PyWeakref_GET_OBJECT 
Py_InitModule 
Py_InitModule3 
Py_InitModule4 
1

This thread en el Python-Dev sugiere que tal lista no existe. El hilo también discute qué hacer al respecto.

Cuestiones relacionadas