函式物件

有一些函式是 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 版本加入。