函式物件

有一些特定於 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 新版功能.