函数对象¶
有一些函数是 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_GetModule(PyObject *op)¶
- 返回值:借用的引用。
返回对
__module__
属性的 借用的引用, 该属性是 函数对象 op 的属性。它可能为 NULL。这通常是一个包含模块名称的
字符串
,但可以通过 Python 代码将其设置为任何其他对象。
-
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 版本加入。
-
int PyFunction_SetClosure(PyObject *op, PyObject *closure)¶
设置与函数对象 op 关联的闭包。closure 必须是
Py_None
或单元格对象的元组。如果失败,则引发
SystemError
并返回-1
。
-
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)¶
函数监视器回调函数的类型。
如果 event 是
PyFunction_EVENT_CREATE
或PyFunction_EVENT_DESTROY
,则 new_value 将为NULL
。否则,new_value 将保存一个指向即将存储在 func 中用于正在修改的属性的新值的借用引用。回调可以检查但不得修改 func;这样做可能会产生不可预测的影响,包括无限递归。
如果 event 是
PyFunction_EVENT_CREATE
,则在 func 完全初始化后调用回调。否则,在对 func 进行修改之前调用回调,因此可以检查 func 的先前状态。运行时允许在可能的情况下优化掉函数对象的创建。在这种情况下,不会发出任何事件。尽管这会因优化决策而产生运行时行为的明显差异,但它不会更改正在执行的 Python 代码的语义。如果 event 是
PyFunction_EVENT_DESTROY
,则在回调中引用即将被销毁的函数会使其复活,阻止它此时被释放。当复活的对象稍后被销毁时,此时处于活动状态的任何监视器回调都将再次被调用。如果回调设置了异常,则必须返回
-1
;此异常将使用PyErr_WriteUnraisable()
作为无法引发的异常打印。否则,它应返回0
。在进入回调时可能已经设置了挂起的异常。在这种情况下,回调应返回
0
,并且仍然设置相同的异常。这意味着回调不能调用任何其他可能设置异常的 API,除非它先保存并清除异常状态,并在返回之前恢复它。3.12 版本加入。