函数对象¶
有一些特定于 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_GetModule(PyObject *op)¶
- 返回值:借用引用。
返回 函数对象 op 的
__module__
属性的 借用引用。它可以是 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
。
-
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)¶
函数观察器回调函数的类型。
如果 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 新版功能.