函数对象

有一些函数是 Python 函数特有的。

type PyFunctionObject

用于函数的 C 结构体。

PyTypeObject PyFunction_Type

这是 PyTypeObject 的一个实例,表示 Python 函数类型。它以 types.FunctionType 的形式暴露给 Python 程序员。

int PyFunction_Check(PyObject *o)

如果 o 是一个函数对象(具有类型 PyFunction_Type),则返回真。该参数不能为 NULL。此函数总是成功。

PyObject *PyFunction_New(PyObject *code, PyObject *globals)
返回值:新的引用。

返回一个与代码对象 code 关联的新函数对象。globals 必须是一个字典,包含该函数可以访问的全局变量。

函数的文档字符串和名称从代码对象中检索。__module__globals 中检索。参数默认值、注解和闭包设置为 NULL__qualname__ 设置为与代码对象的 co_qualname 字段相同的值。

PyObject *PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
返回值:新的引用。

PyFunction_New() 相同,但还允许设置函数对象的 __qualname__ 属性。qualname 应该是一个 Unicode 对象或 NULL;如果为 NULL,则 __qualname__ 属性设置为与代码对象的 co_qualname 字段相同的值。

3.3 版本加入。

PyObject *PyFunction_GetCode(PyObject *op)
返回值:借用的引用。

返回与函数对象 op 关联的代码对象。

PyObject *PyFunction_GetGlobals(PyObject *op)
返回值:借用的引用。

返回与函数对象 op 关联的全局变量字典。

PyObject *PyFunction_GetModule(PyObject *op)
返回值:借用的引用。

返回对 __module__ 属性的 借用的引用, 该属性是 函数对象 op 的属性。它可能为 NULL

这通常是一个包含模块名称的 字符串,但可以通过 Python 代码将其设置为任何其他对象。

PyObject *PyFunction_GetDefaults(PyObject *op)
返回值:借用的引用。

返回函数对象 op 的参数默认值。这可以是一个参数元组或 NULL

int PyFunction_SetDefaults(PyObject *op, PyObject *defaults)

为函数对象 op 设置参数默认值。defaults 必须是 Py_None 或一个元组。

如果失败,则引发 SystemError 并返回 -1

void PyFunction_SetVectorcall(PyFunctionObject *func, vectorcallfunc vectorcall)

设置给定函数对象 func 的 vectorcall 字段。

警告:使用此 API 的扩展必须保留未修改(默认)的 vectorcall 函数的行为!

3.12 版本加入。

PyObject *PyFunction_GetClosure(PyObject *op)
返回值:借用的引用。

返回与函数对象 op 关联的闭包。这可以是 NULL 或单元格对象的元组。

int PyFunction_SetClosure(PyObject *op, PyObject *closure)

设置与函数对象 op 关联的闭包。closure 必须是 Py_None 或单元格对象的元组。

如果失败,则引发 SystemError 并返回 -1

PyObject *PyFunction_GetAnnotations(PyObject *op)
返回值:借用的引用。

返回函数对象 op 的注解。这可以是可变字典或 NULL

int PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)

设置函数对象 op 的注解。annotations 必须是字典或 Py_None

如果失败,则引发 SystemError 并返回 -1

int PyFunction_AddWatcher(PyFunction_WatchCallback callback)

callback 注册为当前解释器的函数监视器。返回一个 ID,该 ID 可以传递给 PyFunction_ClearWatcher()。如果发生错误(例如,没有更多可用的监视器 ID),则返回 -1 并设置异常。

3.12 版本加入。

int PyFunction_ClearWatcher(int watcher_id)

清除由 watcher_id 标识的监视器,该监视器之前由当前解释器的 PyFunction_AddWatcher() 返回。成功时返回 0,如果出错(例如,如果从未注册给定的 watcher_id),则返回 -1 并设置异常。

3.12 版本加入。

type PyFunction_WatchEvent

可能发生的函数监视器事件的枚举: - PyFunction_EVENT_CREATE - PyFunction_EVENT_DESTROY - PyFunction_EVENT_MODIFY_CODE - PyFunction_EVENT_MODIFY_DEFAULTS - PyFunction_EVENT_MODIFY_KWDEFAULTS

3.12 版本加入。

typedef int (*PyFunction_WatchCallback)(PyFunction_WatchEvent event, PyFunctionObject *func, PyObject *new_value)

函数监视器回调函数的类型。

如果 eventPyFunction_EVENT_CREATEPyFunction_EVENT_DESTROY,则 new_value 将为 NULL。否则,new_value 将保存一个指向即将存储在 func 中用于正在修改的属性的新值的借用引用

回调可以检查但不得修改 func;这样做可能会产生不可预测的影响,包括无限递归。

如果 eventPyFunction_EVENT_CREATE,则在 func 完全初始化后调用回调。否则,在对 func 进行修改之前调用回调,因此可以检查 func 的先前状态。运行时允许在可能的情况下优化掉函数对象的创建。在这种情况下,不会发出任何事件。尽管这会因优化决策而产生运行时行为的明显差异,但它不会更改正在执行的 Python 代码的语义。

如果 eventPyFunction_EVENT_DESTROY,则在回调中引用即将被销毁的函数会使其复活,阻止它此时被释放。当复活的对象稍后被销毁时,此时处于活动状态的任何监视器回调都将再次被调用。

如果回调设置了异常,则必须返回 -1;此异常将使用 PyErr_WriteUnraisable() 作为无法引发的异常打印。否则,它应返回 0

在进入回调时可能已经设置了挂起的异常。在这种情况下,回调应返回 0,并且仍然设置相同的异常。这意味着回调不能调用任何其他可能设置异常的 API,除非它先保存并清除异常状态,并在返回之前恢复它。

3.12 版本加入。