【问题标题】:Python C-API functions that borrow and steal references借用和窃取引用的 Python C-API 函数
【发布时间】:2012-05-02 03:08:01
【问题描述】:

Python C-API 中的标准约定是这样的

  • 函数不会从输入参数(即对象)中窃取引用

  • 返回值和输出参数(即对象)拥有一个引用

Python C-API 中的大多数函数都遵循这个约定。但是,也有一些例外。我遇到了以下情况:

从输入参数中窃取引用的函数

PyModule_AddObject

带有借用引用的返回值或输出参数的函数

PyErr_Occurred
PyTuple_GetItem
PyTuple_GETITEM
PyDict_GetItem
PyDict_GetItemString
PyDict_Next

在任何地方都有此类功能的完整列表吗?在编写 Python 扩展模块时,这样的列表将是一个有用的参考。

【问题讨论】:

  • 这对 Python 开发人员来说似乎是个好问题。

标签: python python-c-api reference-counting


【解决方案1】:

Python-Dev 上的This thread 强烈建议不存在这样的列表。该主题还讨论了如何处理它。

【讨论】:

    【解决方案2】:

    在 Python 2.7.2 C-API 文档中对单词“steal”和“borrow”的文本搜索给出了以下列表:

    从输入参数中窃取引用的函数

    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
    

    【讨论】:

      猜你喜欢
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 2020-09-17
      • 1970-01-01
      • 1970-01-01
      • 2012-11-03
      • 2017-04-06
      相关资源
      最近更新 更多