2012-04-20 12 views
10

La convenzione standard in Python C-API è chePython funzioni C-API che prendere in prestito e rubare riferimenti

  • funzioni non rubare riferimenti da argomenti di input (che sono oggetti)

  • ritorno valori e argomenti di uscita (che sono oggetti) possiedono un riferimento

maggior parte delle funzioni del pitone C-API seguire questa convenzione. Tuttavia, ci sono alcune eccezioni. Ho incontrato il seguente:

funzioni che rubare un riferimento da un parametro di input

PyModule_AddObject 

funzioni con valori di ritorno o argomenti di uscita che prendere in prestito un riferimento

PyErr_Occurred 
PyTuple_GetItem 
PyTuple_GETITEM 
PyDict_GetItem 
PyDict_GetItemString 
PyDict_Next 

Is esiste un elenco completo di tali funzioni ovunque? Tale lista sarebbe un utile riferimento quando si scrivono i moduli di estensione Python.

+0

Questa sembra una buona domanda per gli sviluppatori Python. – phkahler

risposta

7

Una ricerca nelle Python 2.7.2 docs C-API per le parole "rubare" e "prendere in prestito" ha dato i seguenti elenchi:

funzioni che rubano un riferimento da un argomento di input

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

Funzioni con valori di ritorno o argomenti di uscita che prendere in prestito un riferimento

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 sul Python-Dev suggerisce fortemente che tale elenco non esiste. Il thread discute anche cosa fare al riguardo.

Problemi correlati