2012-04-20 7 views
10

Die Standardkonvention in dem Python C-API ist, dassPython C-API-Funktionen, die Referenzen borgen und stehlen

  • Funktionen nicht stehlen Referenzen von Eingangsargumenten (die Objekte)

  • return Werte und Ausgabeargumente (das sind Objekte) besitzen eine Referenz

Die meisten Funktionen in der Python C-API folgen dieser Konvention. Es gibt jedoch einige Ausnahmen. Ich habe über die folgenden kommen:

Funktionen, die einen Verweis aus einem Eingang Argumente

PyModule_AddObject 

Funktionen mit Rückgabewerten oder Ausgabeargumenten stehlen, die einen Verweis

PyErr_Occurred 
PyTuple_GetItem 
PyTuple_GETITEM 
PyDict_GetItem 
PyDict_GetItemString 
PyDict_Next 

Ist leihen gibt es eine umfassende Liste solcher Funktionen überall? Eine solche Liste wäre eine nützliche Referenz beim Schreiben von Python-Erweiterungsmodulen.

+0

Dies scheint eine gute Frage für die Python-Entwickler zu sein. – phkahler

Antwort

7

A Textsuche in der Python 2.7.2 C-API-Dokumentation für die Worte „stehlen“ und „borgen“, ergab die folgenden Listen:

Funktionen, die eine Referenz von einem Eingangsargument

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

Funktionen mit Rückgabewerte oder Ausgabeargumente, die eine Referenz

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 
borgen
1

This thread auf der Python-Dev schlägt stark vor, dass eine solche Liste nicht existiert. Der Thread beschreibt auch, was Sie dagegen tun können.