Đối tượng chức năng

Có một số hàm dành riêng cho hàm Python.

type PyFunctionObject

Cấu trúc C được sử dụng cho các hàm.

PyTypeObject PyFunction_Type

Đây là một phiên bản của PyTypeObject và đại diện cho loại hàm Python. Nó được các lập trình viên Python tiếp xúc với tên types.FunctionType.

int PyFunction_Check(PyObject *o)

Trả về true nếu o là một đối tượng hàm (có loại PyFunction_Type). Tham số không được là NULL. Chức năng này luôn thành công.

PyObject *PyFunction_New(PyObject *code, PyObject *globals)
Giá trị trả về: Tham chiếu mới.

Trả về một đối tượng hàm mới được liên kết với đối tượng mã code. globals phải là một từ điển có các biến toàn cục mà hàm có thể truy cập được.

Chuỗi tài liệu và tên của hàm được lấy từ đối tượng mã. __module__ được lấy từ globals. Các giá trị mặc định, chú thích và đóng đối số được đặt thành NULL. __qualname__ được đặt thành cùng giá trị với trường co_qualname của đối tượng mã.

PyObject *PyFunction_NewWithQualName(PyObject *code, PyObject *globals, PyObject *qualname)
Giá trị trả về: Tham chiếu mới.

Giống như PyFunction_New() nhưng cũng cho phép thiết lập thuộc tính __qualname__ của đối tượng hàm. qualname phải là đối tượng unicode hoặc NULL; nếu NULL, thuộc tính __qualname__ được đặt thành cùng giá trị với trường co_qualname của đối tượng mã.

Added in version 3.3.

PyObject *PyFunction_GetCode(PyObject *op)
Giá trị trả về: Tham chiếu mượn.

Trả về đối tượng mã được liên kết với đối tượng hàm op.

PyObject *PyFunction_GetGlobals(PyObject *op)
Giá trị trả về: Tham chiếu mượn.

Trả về từ điển toàn cục được liên kết với đối tượng hàm op.

PyObject *PyFunction_GetModule(PyObject *op)
Giá trị trả về: Tham chiếu mượn.

Trả về borrowed reference cho thuộc tính __module__ của function object op. Nó có thể là NULL.

Đây thường là string chứa tên mô-đun, nhưng có thể được đặt thành bất kỳ đối tượng nào khác bằng mã Python.

PyObject *PyFunction_GetDefaults(PyObject *op)
Giá trị trả về: Tham chiếu mượn.

Trả về các giá trị mặc định của đối số của đối tượng hàm op. Đây có thể là một bộ đối số hoặc NULL.

int PyFunction_SetDefaults(PyObject *op, PyObject *defaults)

Đặt các giá trị mặc định của đối số cho đối tượng hàm op. defaults phải là Py_None hoặc một bộ dữ liệu.

Tăng SystemError và trả về -1 khi thất bại.

void PyFunction_SetVectorcall(PyFunctionObject *func, vectorcallfunc vectorcall)

Đặt trường vectorcall của đối tượng hàm đã cho func.

Cảnh báo: các tiện ích mở rộng sử dụng API này phải duy trì hoạt động của hàm vectorcall không thay đổi (mặc định)!

Added in version 3.12.

PyObject *PyFunction_GetKwDefaults(PyObject *op)
Giá trị trả về: Tham chiếu mượn.

Trả về các giá trị mặc định đối số chỉ từ khóa của đối tượng hàm op. Đây có thể là một từ điển các đối số hoặc NULL.

int PyFunction_SetKwDefaults(PyObject *op, PyObject *defaults)

Đặt các giá trị mặc định đối số chỉ từ khóa của đối tượng hàm op. defaults phải là từ điển của các đối số chỉ có từ khóa hoặc Py_None.

Hàm này trả về 0 nếu thành công và trả về -1 với ngoại lệ được đặt nếu thất bại.

PyObject *PyFunction_GetClosure(PyObject *op)
Giá trị trả về: Tham chiếu mượn.

Trả về bao đóng được liên kết với đối tượng hàm op. Đây có thể là NULL hoặc một bộ đối tượng ô.

int PyFunction_SetClosure(PyObject *op, PyObject *closure)

Đặt bao đóng được liên kết với đối tượng hàm op. closure phải là Py_None hoặc một bộ đối tượng ô.

Tăng SystemError và trả về -1 khi thất bại.

PyObject *PyFunction_GetAnnotations(PyObject *op)
Giá trị trả về: Tham chiếu mượn.

Trả về các chú thích của đối tượng hàm op. Đây có thể là một từ điển có thể thay đổi hoặc NULL.

int PyFunction_SetAnnotations(PyObject *op, PyObject *annotations)

Đặt chú thích cho đối tượng hàm op. annotations phải là từ điển hoặc Py_None.

Tăng SystemError và trả về -1 khi thất bại.

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)
Giá trị trả về: Tham chiếu mượn.

Các chức năng này tương tự như các chức năng tương tự của PyFunction_Get* nhưng không kiểm tra loại. Truyền bất cứ thứ gì ngoài phiên bản PyFunction_Type là hành vi không xác định.

int PyFunction_AddWatcher(PyFunction_WatchCallback callback)

Đăng ký callback làm người theo dõi chức năng cho trình thông dịch hiện tại. Trả lại ID có thể được chuyển tới PyFunction_ClearWatcher(). Trong trường hợp có lỗi (ví dụ: không còn ID người theo dõi), hãy trả về -1 và đặt ngoại lệ.

Added in version 3.12.

int PyFunction_ClearWatcher(int watcher_id)

Trình theo dõi rõ ràng được xác định bởi watcher_id trước đây được trả về từ PyFunction_AddWatcher() cho trình thông dịch hiện tại. Trả về 0 nếu thành công hoặc -1 và đặt ngoại lệ nếu có lỗi (ví dụ: nếu watcher_id đã cho chưa bao giờ được đăng ký.)

Added in version 3.12.

type PyFunction_WatchEvent

Liệt kê các sự kiện theo dõi chức năng có thể có:

  • PyFunction_EVENT_CREATE

  • PyFunction_EVENT_DESTROY

  • PyFunction_EVENT_MODIFY_CODE

  • PyFunction_EVENT_MODIFY_DEFAULTS

  • PyFunction_EVENT_MODIFY_KWDEFAULTS

Added in version 3.12.

typedef int (*PyFunction_WatchCallback)(PyFunction_WatchEvent event, PyFunctionObject *func, PyObject *new_value)

Loại chức năng gọi lại của người theo dõi chức năng.

Nếu eventPyFunction_EVENT_CREATE hoặc PyFunction_EVENT_DESTROY thì new_value sẽ là NULL. Nếu không, new_value sẽ giữ borrowed reference ở giá trị mới sắp được lưu trữ trong func cho thuộc tính đang được sửa đổi.

Cuộc gọi lại có thể kiểm tra nhưng không được sửa đổi func; làm như vậy có thể có những tác động không thể đoán trước, bao gồm cả đệ quy vô hạn.

Nếu eventPyFunction_EVENT_CREATE thì lệnh gọi lại sẽ được gọi sau khi func được khởi tạo hoàn toàn. Nếu không, lệnh gọi lại sẽ được gọi trước khi sửa đổi func diễn ra, do đó có thể kiểm tra trạng thái trước đó của func. Thời gian chạy được phép tối ưu hóa việc tạo các đối tượng hàm khi có thể. Trong những trường hợp như vậy sẽ không có sự kiện nào được phát ra. Mặc dù điều này tạo ra khả năng có sự khác biệt có thể quan sát được về hành vi thời gian chạy tùy thuộc vào các quyết định tối ưu hóa, nhưng nó không làm thay đổi ngữ nghĩa của mã Python đang được thực thi.

Nếu eventPyFunction_EVENT_DESTROY, việc tham chiếu hàm sắp bị phá hủy trong hàm gọi lại sẽ phục hồi hàm đó, ngăn không cho hàm đó được giải phóng vào lúc này. Khi đối tượng được phục hồi bị phá hủy sau đó, mọi lệnh gọi lại của người theo dõi đang hoạt động tại thời điểm đó sẽ được gọi lại.

Nếu lệnh gọi lại đặt ngoại lệ, nó phải trả về -1; ngoại lệ này sẽ được in dưới dạng ngoại lệ không thể xử lý được bằng PyErr_WriteUnraisable(). Nếu không nó sẽ trả về 0.

Có thể đã có một ngoại lệ đang chờ xử lý được đặt khi truy cập lệnh gọi lại. Trong trường hợp này, lệnh gọi lại sẽ trả về 0 với cùng một ngoại lệ vẫn được đặt. Điều này có nghĩa là lệnh gọi lại không được gọi bất kỳ API nào khác có thể đặt ngoại lệ trừ khi nó lưu và xóa trạng thái ngoại lệ trước, đồng thời khôi phục nó trước khi quay lại.

Added in version 3.12.