函数对象

有一些特定于 Python 函数的函数。

type PyFunctionObject

用于函数的 C 结构体。

PyTypeObject PyFunction_Type

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

int PyFunction_Check(PyObject *o)

如果 o 是一个函数对象(类型为 PyFunction_Type),则返回 true。参数不能为 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)
返回值:借用引用。

返回 函数对象 op__module__ 属性的 借用引用。它可以是 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_GetKwDefaults(PyObject *op)
返回值:借用引用。

返回函数对象 op 的仅限关键字参数默认值。这可以是一个参数字典或 NULL

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

PyObject *PyFunction_GET_CODE(PyObject *op)
PyObject *PyFunction_GET_GLOBALS(PyObject *op)
PyObject *PyFunction_GET_MODULE(PyObject *op)
PyObject *PyFunction_GET_DEFAULTS(PyObject *op)
PyObject *PyFunction_GET_KW_DEFAULTS(PyObject *op)
PyObject *PyFunction_GET_CLOSURE(PyObject *op)
PyObject *PyFunction_GET_ANNOTATIONS(PyObject *op)
返回值:借用引用。

这些函数与其 PyFunction_Get* 对应函数类似,但不进行类型检查。传递任何不是 PyFunction_Type 实例的对象都会导致未定义行为。

int PyFunction_AddWatcher(PyFunction_WatchCallback callback)

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

3.12 新版功能.

int PyFunction_ClearWatcher(int watcher_id)

清除由之前从 PyFunction_AddWatcher() 返回的 watcher_id 标识的当前解释器的观察器。成功时返回 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 新版功能.