Функции Python C-API, которые заимствуют и крадут ссылки

Стандартное соглашение в Python C-API заключается в том, что

  • функции не крадут ссылки из входных аргументов (которые являются объектами)

  • возвращаемые значения и выходные аргументы (которые являются объектами) имеют ссылку

Большинство функций в Python C-API следуют этому соглашению. Однако есть некоторые исключения. Я сталкивался со следующим:

Функции, которые крадут ссылку из входного аргумента

PyModule_AddObject

Функции с возвращаемыми значениями или выходными аргументами, которые заимствуют ссылку

PyErr_Occurred
PyTuple_GetItem
PyTuple_GETITEM
PyDict_GetItem
PyDict_GetItemString
PyDict_Next

Есть ли где-нибудь полный список таких функций? Такой список будет полезен при написании модулей расширения Python.

2 ответа

Решение

Текстовый поиск в документах C-API Python 2.7.2 по словам "украсть" и "брать" дал следующие списки:

Функции, которые крадут ссылку из входного аргумента

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

Функции с возвращаемыми значениями или выходными аргументами, которые заимствуют ссылку

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

Этот поток в Python-Dev настоятельно рекомендует, что такого списка не существует. В ветке также обсуждается, что с этим делать.

Другие вопросы по тегам