2012-04-20 11 views
10

w standardowej konwencji, w Python C API jestPython funkcje C API, które pożyczać i stali odniesienia

  • funkcje nie kradzieży referencji argumentów wejściowych (które są obiekty)

  • powrotu wartości i argumenty wyjściowe (które są obiektami) posiadają odniesienie

Większość funkcji w C-API Pythona jest zgodna z tą konwencją. Jednakże, jest kilka wyjątków. Mam natknąć się poniżej:

Funkcje kradnące odwołanie od argumentu wejściowego

PyModule_AddObject 

funkcji z wartościami zwrotnych lub argumentów wyjściowych pożyczyć odniesienie

PyErr_Occurred 
PyTuple_GetItem 
PyTuple_GETITEM 
PyDict_GetItem 
PyDict_GetItemString 
PyDict_Next 

Czy istnieje obszerna lista takich funkcji w dowolnym miejscu? Taka lista byłaby użytecznym odniesieniem podczas pisania modułów rozszerzających Pythona.

+0

Wydaje się to dobrym pytaniem dla programistów Pythona. – phkahler

Odpowiedz

7

Przeszukanie tekst w Python 2.7.2 C-API docs dla słowa „kradnie” i „pożyczyć” dał następujące listy:

funkcje, które kradną odwołanie od argumentu wejściowego

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

Funkcje z wartości zwracanych lub argumentów wyjściowych pożyczyć odniesienie

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 na Python-Dev silnie sugeruje, że taka lista nie istnieje. Wątek omawia także, co z tym zrobić.