Giao thức đối tượng¶
-
PyObject *Py_GetConstant(unsigned int constant_id)¶
- Một phần của ABI ổn định kể từ phiên bản 3.13.
Nhận strong reference về một hằng số.
Đặt ngoại lệ và trả về
NULLnếu constant_id không hợp lệ.constant_id phải là một trong những số nhận dạng không đổi sau:
Mã định danh không đổi
Giá trị
Đối tượng được trả về
-
Py_CONSTANT_NONE¶
0-
Py_CONSTANT_FALSE¶
1-
Py_CONSTANT_TRUE¶
2-
Py_CONSTANT_ELLIPSIS¶
3-
Py_CONSTANT_NOT_IMPLEMENTED¶
4-
Py_CONSTANT_ZERO¶
50-
Py_CONSTANT_ONE¶
61-
Py_CONSTANT_EMPTY_STR¶
7''-
Py_CONSTANT_EMPTY_BYTES¶
8b''-
Py_CONSTANT_EMPTY_TUPLE¶
9()Các giá trị số chỉ được đưa ra cho các dự án không thể sử dụng định danh không đổi.
Added in version 3.13.
Trong CPython, tất cả các hằng số này đều là immortal.
-
Py_CONSTANT_NONE¶
-
PyObject *Py_GetConstantBorrowed(unsigned int constant_id)¶
- Một phần của ABI ổn định kể từ phiên bản 3.13.
Tương tự như
Py_GetConstant()nhưng trả về borrowed reference.Chức năng này chủ yếu nhằm mục đích tương thích ngược: nên sử dụng
Py_GetConstant()cho mã mới.Tham chiếu được mượn từ trình thông dịch và có hiệu lực cho đến khi trình thông dịch hoàn tất.
Added in version 3.13.
-
PyObject *Py_NotImplemented¶
Singleton
NotImplemented, được sử dụng để báo hiệu rằng một thao tác không được triển khai đối với tổ hợp loại đã cho.
-
Py_RETURN_NOTIMPLEMENTED¶
Xử lý đúng cách việc trả về
Py_NotImplementedtừ bên trong hàm C (nghĩa là tạo một strong reference mới choNotImplementedvà trả về nó).
-
Py_PRINT_RAW¶
Cờ được sử dụng với nhiều hàm in đối tượng (như
PyObject_Print()vàPyFile_WriteObject()). Nếu được thông qua, các hàm này sẽ sử dụngstr()của đối tượng thay vìrepr().
-
int PyObject_Print(PyObject *o, FILE *fp, int flags)¶
In một đối tượng o, trên file fp. Trả về
-1do lỗi. Đối số flags được sử dụng để kích hoạt các tùy chọn in nhất định. Tùy chọn duy nhất hiện được hỗ trợ làPy_PRINT_RAW; nếu được cung cấp,str()của đối tượng sẽ được viết thay vìrepr().
-
int PyObject_HasAttrWithError(PyObject *o, PyObject *attr_name)¶
- Một phần của ABI ổn định kể từ phiên bản 3.13.
Trả về
1nếu o có thuộc tính attr_name và0nếu không. Điều này tương đương với biểu thức Pythonhasattr(o, attr_name). Nếu thất bại, hãy trả lại-1.Added in version 3.13.
-
int PyObject_HasAttrStringWithError(PyObject *o, const char *attr_name)¶
- Một phần của ABI ổn định kể từ phiên bản 3.13.
Điều này giống với
PyObject_HasAttrWithError(), nhưng attr_name được chỉ định là chuỗi byte được mã hóa const char* UTF-8, thay vì PyObject*.Added in version 3.13.
-
int PyObject_HasAttr(PyObject *o, PyObject *attr_name)¶
- Một phần của ABI ổn định.
Trả về
1nếu o có thuộc tính attr_name và0nếu không. Chức năng này luôn thành công.Ghi chú
Các ngoại lệ xảy ra khi lệnh này gọi các phương thức
__getattr__()và__getattribute__()không được truyền bá mà thay vào đó được trao chosys.unraisablehook(). Để xử lý lỗi thích hợp, hãy sử dụngPyObject_HasAttrWithError(),PyObject_GetOptionalAttr()hoặcPyObject_GetAttr()thay thế.
-
int PyObject_HasAttrString(PyObject *o, const char *attr_name)¶
- Một phần của ABI ổn định.
Điều này giống với
PyObject_HasAttr(), nhưng attr_name được chỉ định là chuỗi byte được mã hóa const char* UTF-8, thay vì PyObject*.Ghi chú
Các ngoại lệ xảy ra khi điều này gọi các phương thức
__getattr__()và__getattribute__()hoặc trong khi tạo đối tượngstrtạm thời đều bị bỏ qua âm thầm. Để xử lý lỗi thích hợp, hãy sử dụngPyObject_HasAttrStringWithError(),PyObject_GetOptionalAttrString()hoặcPyObject_GetAttrString()thay thế.
-
PyObject *PyObject_GetAttr(PyObject *o, PyObject *attr_name)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Truy xuất thuộc tính có tên attr_name từ đối tượng o. Trả về giá trị thuộc tính nếu thành công hoặc
NULLnếu thất bại. Điều này tương đương với biểu thức Pythono.attr_name.Nếu thuộc tính bị thiếu không được coi là lỗi, bạn có thể sử dụng
PyObject_GetOptionalAttr()để thay thế.
-
PyObject *PyObject_GetAttrString(PyObject *o, const char *attr_name)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Điều này giống với
PyObject_GetAttr(), nhưng attr_name được chỉ định là chuỗi byte được mã hóa const char* UTF-8, thay vì PyObject*.Nếu thuộc tính bị thiếu không được coi là lỗi, bạn có thể sử dụng
PyObject_GetOptionalAttrString()để thay thế.
-
int PyObject_GetOptionalAttr(PyObject *obj, PyObject *attr_name, PyObject **result);¶
- Một phần của ABI ổn định kể từ phiên bản 3.13.
Biến thể của
PyObject_GetAttr()không tăngAttributeErrornếu không tìm thấy thuộc tính.Nếu thuộc tính được tìm thấy, hãy trả về
1và đặt *result thành strong reference mới cho thuộc tính. Nếu không tìm thấy thuộc tính, hãy trả về0và đặt *result thànhNULL;AttributeErrorbị tắt tiếng. Nếu xuất hiện lỗi không phảiAttributeError, hãy trả về-1và đặt *result thànhNULL.Added in version 3.13.
-
int PyObject_GetOptionalAttrString(PyObject *obj, const char *attr_name, PyObject **result);¶
- Một phần của ABI ổn định kể từ phiên bản 3.13.
Điều này giống với
PyObject_GetOptionalAttr(), nhưng attr_name được chỉ định là chuỗi byte được mã hóa const char* UTF-8, thay vì PyObject*.Added in version 3.13.
-
PyObject *PyObject_GenericGetAttr(PyObject *o, PyObject *name)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Hàm getter thuộc tính chung được đặt vào vị trí
tp_getattrocủa đối tượng loại. Nó tìm kiếm một bộ mô tả trong từ điển của các lớp trong MRO của đối tượng cũng như một thuộc tính trong__dict__của đối tượng (nếu có). Như đã nêu trong Triển khai mô tả, các bộ mô tả dữ liệu được ưu tiên hơn các thuộc tính phiên bản, trong khi các bộ mô tả không phải dữ liệu thì không. Nếu không,AttributeErrorsẽ xuất hiện.
-
int PyObject_SetAttr(PyObject *o, PyObject *attr_name, PyObject *v)¶
- Một phần của ABI ổn định.
Đặt giá trị của thuộc tính có tên attr_name, cho đối tượng o, thành giá trị v. Đưa ra một ngoại lệ và trả về
-1khi thất bại; trả về0khi thành công. Điều này tương đương với câu lệnh Pythono.attr_name = v.Nếu v là
NULL, thuộc tính sẽ bị xóa. Hành vi này không được chấp nhận để sử dụngPyObject_DelAttr()nhưng hiện tại không có kế hoạch loại bỏ nó.
-
int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v)¶
- Một phần của ABI ổn định.
Điều này giống với
PyObject_SetAttr(), nhưng attr_name được chỉ định là chuỗi byte được mã hóa const char* UTF-8, thay vì PyObject*.Nếu v là
NULL, thuộc tính sẽ bị xóa nhưng tính năng này không được dùng nữa để sử dụngPyObject_DelAttrString().Số lượng tên thuộc tính khác nhau được truyền cho hàm này phải được giữ ở mức nhỏ, thường bằng cách sử dụng chuỗi được phân bổ tĩnh như attr_name. Đối với các tên thuộc tính không được biết tại thời điểm biên dịch, hãy gọi trực tiếp
PyUnicode_FromString()vàPyObject_SetAttr(). Để biết thêm chi tiết, hãy xemPyUnicode_InternFromString(), có thể được sử dụng nội bộ để tạo đối tượng chính.
-
int PyObject_GenericSetAttr(PyObject *o, PyObject *name, PyObject *value)¶
- Một phần của ABI ổn định.
Hàm xóa và thiết lập thuộc tính chung được dùng để đặt vào khe
tp_setattrocủa đối tượng loại. Nó tìm kiếm một bộ mô tả dữ liệu trong từ điển của các lớp trong MRO của đối tượng và nếu tìm thấy nó sẽ ưu tiên cài đặt hoặc xóa thuộc tính trong từ điển cá thể. Ngược lại, thuộc tính sẽ được đặt hoặc xóa trong__dict__của đối tượng (nếu có). Nếu thành công,0được trả về, nếu không thìAttributeErrorđược nâng lên và-1được trả về.
-
int PyObject_DelAttr(PyObject *o, PyObject *attr_name)¶
- Một phần của ABI ổn định kể từ phiên bản 3.13.
Xóa thuộc tính có tên attr_name cho đối tượng o. Trả về
-1khi thất bại. Điều này tương đương với câu lệnh Pythondel o.attr_name.
-
int PyObject_DelAttrString(PyObject *o, const char *attr_name)¶
- Một phần của ABI ổn định kể từ phiên bản 3.13.
Điều này giống với
PyObject_DelAttr(), nhưng attr_name được chỉ định là chuỗi byte được mã hóa const char* UTF-8, thay vì PyObject*.Số lượng tên thuộc tính khác nhau được truyền cho hàm này phải được giữ ở mức nhỏ, thường bằng cách sử dụng chuỗi được phân bổ tĩnh như attr_name. Đối với các tên thuộc tính không được biết tại thời điểm biên dịch, hãy gọi trực tiếp
PyUnicode_FromString()vàPyObject_DelAttr(). Để biết thêm chi tiết, hãy xemPyUnicode_InternFromString(), có thể được sử dụng nội bộ để tạo đối tượng chính để tra cứu.
-
PyObject *PyObject_GenericGetDict(PyObject *o, void *context)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định kể từ phiên bản 3.10.
Cách triển khai chung cho trình thu thập của bộ mô tả
__dict__. Nó tạo ra từ điển nếu cần thiết.Hàm này cũng có thể được gọi để lấy
__dict__của đối tượng o. ChuyểnNULLcho context khi gọi nó. Vì hàm này có thể cần phân bổ bộ nhớ cho từ điển nên việc gọiPyObject_GetAttr()khi truy cập một thuộc tính trên đối tượng có thể hiệu quả hơn.Nếu thất bại, trả về
NULLvới một bộ ngoại lệ.Added in version 3.3.
-
int PyObject_GenericSetDict(PyObject *o, PyObject *value, void *context)¶
- Một phần của ABI ổn định kể từ phiên bản 3.7.
Cách triển khai chung cho trình thiết lập bộ mô tả
__dict__. Việc triển khai này không cho phép xóa từ điển.Added in version 3.3.
-
PyObject **_PyObject_GetDictPtr(PyObject *obj)¶
Trả về con trỏ tới
__dict__của đối tượng obj. Nếu không có__dict__, hãy trả vềNULLmà không đặt ngoại lệ.Hàm này có thể cần phân bổ bộ nhớ cho từ điển, do đó, việc gọi
PyObject_GetAttr()khi truy cập một thuộc tính trên đối tượng có thể hiệu quả hơn.
-
PyObject *PyObject_RichCompare(PyObject *o1, PyObject *o2, int opid)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
So sánh các giá trị của o1 và o2 bằng cách sử dụng thao tác được chỉ định bởi opid, phải là một trong các giá trị
Py_LT,Py_LE,Py_EQ,Py_NE,Py_GThoặcPy_GE, tương ứng với<,<=,==,!=,>, hoặc>=tương ứng. Điều này tương đương với biểu thứco1 op o2trong Python, trong đóoplà toán tử tương ứng với opid. Trả về giá trị so sánh nếu thành công hoặcNULLnếu thất bại.
-
int PyObject_RichCompareBool(PyObject *o1, PyObject *o2, int opid)¶
- Một phần của ABI ổn định.
So sánh các giá trị của o1 và o2 bằng cách sử dụng thao tác được chỉ định bởi opid, giống như
PyObject_RichCompare(), nhưng trả về-1do lỗi,0nếu kết quả sai,1nếu không.
Ghi chú
Nếu o1 và o2 là cùng một đối tượng, PyObject_RichCompareBool() sẽ luôn trả về 1 cho Py_EQ và 0 cho Py_NE.
-
PyObject *PyObject_Format(PyObject *obj, PyObject *format_spec)¶
- Một phần của ABI ổn định.
Định dạng obj bằng format_spec. Điều này tương đương với biểu thức Python
format(obj, format_spec).format_spec có thể là
NULL. Trong trường hợp này, lệnh gọi tương đương vớiformat(obj). Trả về chuỗi được định dạng nếu thành công,NULLnếu thất bại.
-
PyObject *PyObject_Repr(PyObject *o)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Tính toán biểu diễn chuỗi của đối tượng o. Trả về biểu diễn chuỗi nếu thành công,
NULLnếu thất bại. Điều này tương đương với biểu thức Pythonrepr(o). Được gọi bằng hàm tích hợprepr().Nếu đối số là
NULL, trả về chuỗi'<NULL>'.Thay đổi trong phiên bản 3.4: Hàm này hiện bao gồm một xác nhận gỡ lỗi để giúp đảm bảo rằng nó không âm thầm loại bỏ một ngoại lệ đang hoạt động.
-
PyObject *PyObject_ASCII(PyObject *o)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Với vai
PyObject_Repr(), hãy tính toán biểu diễn chuỗi của đối tượng o, nhưng thoát khỏi các ký tự không phải ASCII trong chuỗi được trả về bởiPyObject_Repr()với các ký tự thoát\x,\uhoặc\U. Điều này tạo ra một chuỗi tương tự như chuỗi được trả về bởiPyObject_Repr()trong Python 2. Được gọi bằng hàm tích hợpascii().Nếu đối số là
NULL, trả về chuỗi'<NULL>'.
-
PyObject *PyObject_Str(PyObject *o)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Tính toán biểu diễn chuỗi của đối tượng o. Trả về biểu diễn chuỗi nếu thành công,
NULLnếu thất bại. Điều này tương đương với biểu thức Pythonstr(o). Được gọi bằng hàm tích hợpstr()và do đó, được gọi bằng hàmprint().Nếu đối số là
NULL, trả về chuỗi'<NULL>'.Thay đổi trong phiên bản 3.4: Hàm này hiện bao gồm một xác nhận gỡ lỗi để giúp đảm bảo rằng nó không âm thầm loại bỏ một ngoại lệ đang hoạt động.
-
PyObject *PyObject_Bytes(PyObject *o)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Tính toán biểu diễn byte của đối tượng o.
NULLđược trả về khi thất bại và đối tượng bytes được trả về khi thành công. Điều này tương đương với biểu thứcbytes(o)trong Python, khi o không phải là số nguyên. Không giống nhưbytes(o), TypeError được nâng lên khi o là một số nguyên thay vì đối tượng byte được khởi tạo bằng 0.Nếu đối số là
NULL, trả về đối tượngbytesb'<NULL>'.
-
int PyObject_IsSubclass(PyObject *derived, PyObject *cls)¶
- Một phần của ABI ổn định.
Trả về
1nếu lớp derived giống hệt hoặc dẫn xuất từ lớp cls, nếu không thì trả về0. Trong trường hợp có lỗi, hãy trả về-1.Nếu cls là một bộ, việc kiểm tra sẽ được thực hiện đối với mọi mục trong cls. Kết quả sẽ là
1khi ít nhất một trong các lần kiểm tra trả về1, nếu không sẽ là0.Nếu cls có phương thức
__subclasscheck__(), nó sẽ được gọi để xác định trạng thái lớp con như được mô tả trong PEP 3119. Mặt khác, derived là lớp con của cls nếu nó là lớp con trực tiếp hoặc gián tiếp, tức là có trongcls.__mro__.Thông thường chỉ các đối tượng lớp, tức là các thể hiện của
typehoặc lớp dẫn xuất, mới được coi là lớp. Tuy nhiên, các đối tượng có thể ghi đè điều này bằng cách có thuộc tính__bases__(phải là một bộ các lớp cơ sở).
-
int PyObject_IsInstance(PyObject *inst, PyObject *cls)¶
- Một phần của ABI ổn định.
Trả về
1nếu inst là một phiên bản của lớp cls hoặc một lớp con của cls hoặc0nếu không. Nếu có lỗi, trả về-1và đặt ngoại lệ.Nếu cls là một bộ, việc kiểm tra sẽ được thực hiện đối với mọi mục trong cls. Kết quả sẽ là
1khi ít nhất một trong các lần kiểm tra trả về1, nếu không sẽ là0.Nếu cls có phương thức
__instancecheck__(), nó sẽ được gọi để xác định trạng thái lớp con như được mô tả trong PEP 3119. Mặt khác, inst là một phiên bản của cls nếu lớp của nó là lớp con của cls.Một cá thể inst có thể ghi đè những gì được coi là lớp của nó bằng cách có thuộc tính
__class__.Một đối tượng cls có thể ghi đè nếu nó được coi là một lớp và các lớp cơ sở của nó là gì, bằng cách có thuộc tính
__bases__(phải là một bộ các lớp cơ sở).
-
Py_hash_t PyObject_Hash(PyObject *o)¶
- Một phần của ABI ổn định.
Tính toán và trả về giá trị băm của đối tượng o. Nếu thất bại, trả về
-1. Điều này tương đương với biểu thức Pythonhash(o).Thay đổi trong phiên bản 3.2: Kiểu trả về bây giờ là Py_hash_t. Đây là số nguyên có dấu có cùng kích thước với
Py_ssize_t.
-
Py_hash_t PyObject_HashNotImplemented(PyObject *o)¶
- Một phần của ABI ổn định.
Đặt
TypeErrorcho biếttype(o)không phải là hashable và trả về-1. Hàm này được xử lý đặc biệt khi được lưu trữ trong khetp_hash, cho phép một loại chỉ rõ rõ ràng cho trình thông dịch rằng nó không thể băm được.
-
int PyObject_IsTrue(PyObject *o)¶
- Một phần của ABI ổn định.
Trả về
1nếu đối tượng o được coi là đúng và0nếu ngược lại. Điều này tương đương với biểu thức Pythonnot not o. Nếu thất bại, hãy trả lại-1.
-
int PyObject_Not(PyObject *o)¶
- Một phần của ABI ổn định.
Trả về
0nếu đối tượng o được coi là đúng và1nếu ngược lại. Điều này tương đương với biểu thức Pythonnot o. Nếu thất bại, hãy trả lại-1.
-
PyObject *PyObject_Type(PyObject *o)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Khi o không phải là
NULL, trả về một loại đối tượng tương ứng với loại đối tượng của đối tượng o. Nếu thất bại, tăngSystemErrorvà trả vềNULL. Điều này tương đương với biểu thức Pythontype(o). Hàm này tạo một strong reference mới cho giá trị trả về. Thực sự không có lý do gì để sử dụng hàm này thay vì hàmPy_TYPE(), hàm này trả về một con trỏ kiểu PyTypeObject*, trừ khi cần một strong reference mới.
-
int PyObject_TypeCheck(PyObject *o, PyTypeObject *type)¶
Trả về giá trị khác 0 nếu đối tượng o thuộc loại type hoặc một loại con của type và
0nếu ngược lại. Cả hai tham số phải không phải làNULL.
-
Py_ssize_t PyObject_Size(PyObject *o)¶
-
Py_ssize_t PyObject_Length(PyObject *o)¶
- Một phần của ABI ổn định.
Trả về độ dài của đối tượng o. Nếu đối tượng o cung cấp trình tự và giao thức ánh xạ, thì độ dài chuỗi sẽ được trả về. Nếu có lỗi,
-1sẽ được trả về. Điều này tương đương với biểu thức Pythonlen(o).
-
Py_ssize_t PyObject_LengthHint(PyObject *o, Py_ssize_t defaultvalue)¶
Trả về độ dài ước tính cho đối tượng o. Trước tiên, hãy thử trả về độ dài thực của nó, sau đó ước tính bằng
__length_hint__()và cuối cùng trả về giá trị mặc định. Khi có lỗi trả về-1. Điều này tương đương với biểu thức Pythonoperator.length_hint(o, defaultvalue).Added in version 3.4.
-
PyObject *PyObject_GetItem(PyObject *o, PyObject *key)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Trả về phần tử của o tương ứng với đối tượng key hoặc
NULLkhi bị lỗi. Điều này tương đương với biểu thức Pythono[key].
-
int PyObject_SetItem(PyObject *o, PyObject *key, PyObject *v)¶
- Một phần của ABI ổn định.
Ánh xạ đối tượng key tới giá trị v. Đưa ra một ngoại lệ và trả về
-1khi thất bại; trả về0khi thành công. Điều này tương đương với câu lệnh Pythono[key] = v. Hàm does not này đánh cắp một tham chiếu đến v.
-
int PyObject_DelItem(PyObject *o, PyObject *key)¶
- Một phần của ABI ổn định.
Xóa ánh xạ cho đối tượng key khỏi đối tượng o. Trả về
-1khi thất bại. Điều này tương đương với câu lệnh Pythondel o[key].
-
int PyObject_DelItemString(PyObject *o, const char *key)¶
- Một phần của ABI ổn định.
Điều này giống với
PyObject_DelItem(), nhưng key được chỉ định là chuỗi byte được mã hóa const char* UTF-8, thay vì PyObject*.
-
PyObject *PyObject_Dir(PyObject *o)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Điều này tương đương với biểu thức Python
dir(o), trả về danh sách các chuỗi (có thể trống) phù hợp với đối số đối tượng hoặcNULLnếu có lỗi. Nếu đối số làNULL, thì đối số này giống nhưdir()của Python, trả về tên của người dân địa phương hiện tại; trong trường hợp này, nếu không có khung thực thi nào được kích hoạt thìNULLsẽ được trả về nhưngPyErr_Occurred()sẽ trả về false.
-
PyObject *PyObject_GetIter(PyObject *o)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Điều này tương đương với biểu thức Python
iter(o). Nó trả về một trình vòng lặp mới cho đối số đối tượng hoặc chính đối tượng đó nếu đối tượng đã là một trình vòng lặp. TăngTypeErrorvà trả vềNULLnếu đối tượng không thể lặp lại được.
-
PyObject *PyObject_SelfIter(PyObject *obj)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định.
Điều này tương đương với phương thức
__iter__(self): return selfcủa Python. Nó dành cho các loại iterator, được sử dụng trong khePyTypeObject.tp_iter.
-
PyObject *PyObject_GetAIter(PyObject *o)¶
- Giá trị trả về: Tham chiếu mới. Một phần của ABI ổn định kể từ phiên bản 3.10.
Điều này tương đương với biểu thức Python
aiter(o). Lấy một đối tượngAsyncIterablevà trả về mộtAsyncIteratorcho nó. Đây thường là một trình vòng lặp mới nhưng nếu đối số làAsyncIteratorthì đối số này sẽ tự trả về. TăngTypeErrorvà trả vềNULLnếu đối tượng không thể lặp lại được.Added in version 3.10.
-
void *PyObject_GetTypeData(PyObject *o, PyTypeObject *cls)¶
- Một phần của ABI ổn định kể từ phiên bản 3.12.
Nhận một con trỏ tới dữ liệu dành riêng cho lớp con dành riêng cho cls.
Đối tượng o phải là một phiên bản của cls và cls phải được tạo bằng
PyType_Spec.basicsizeâm. Python không kiểm tra điều này.Nếu có lỗi, hãy đặt ngoại lệ và trả về
NULL.Added in version 3.12.
-
Py_ssize_t PyType_GetTypeDataSize(PyTypeObject *cls)¶
- Một phần của ABI ổn định kể từ phiên bản 3.12.
Trả về kích thước của không gian bộ nhớ phiên bản dành riêng cho cls, tức là trả về kích thước của bộ nhớ
PyObject_GetTypeData().Giá trị này có thể lớn hơn yêu cầu khi sử dụng
-PyType_Spec.basicsize; việc sử dụng kích thước lớn hơn này là an toàn (ví dụ: vớimemset()).Loại cls must đã được tạo bằng cách sử dụng
PyType_Spec.basicsizeâm. Python không kiểm tra điều này.Nếu có lỗi, hãy đặt ngoại lệ và trả về giá trị âm.
Added in version 3.12.
-
void *PyObject_GetItemData(PyObject *o)¶
Nhận con trỏ tới dữ liệu từng mục cho một lớp có
Py_TPFLAGS_ITEMS_AT_END.Nếu có lỗi, hãy đặt ngoại lệ và trả về
NULL.TypeErrorđược nâng lên nếu o không được đặtPy_TPFLAGS_ITEMS_AT_END.Added in version 3.12.
-
int PyObject_VisitManagedDict(PyObject *obj, visitproc visit, void *arg)¶
Truy cập từ điển được quản lý của obj.
Hàm này chỉ được gọi trong hàm duyệt thuộc loại có bộ cờ
Py_TPFLAGS_MANAGED_DICT.Added in version 3.13.
-
void PyObject_ClearManagedDict(PyObject *obj)¶
Xóa từ điển được quản lý của obj.
Hàm này chỉ được gọi trong một hàm rõ ràng thuộc loại có bộ cờ
Py_TPFLAGS_MANAGED_DICT.Added in version 3.13.
-
int PyUnstable_Object_EnableDeferredRefcount(PyObject *obj)¶
- Đây là API không ổn định. Nó có thể thay đổi mà không có cảnh báo trong các bản phát hành nhỏ.
Bật deferred reference counting trên obj, nếu được bộ thực thi hỗ trợ. Trong bản dựng free-threaded, điều này cho phép trình thông dịch tránh việc điều chỉnh số tham chiếu đối với obj, điều này có thể cải thiện hiệu suất đa luồng. Sự cân bằng là obj sẽ chỉ được giải phóng bởi trình thu gom rác theo dõi chứ không phải khi trình thông dịch không còn bất kỳ tham chiếu nào đến nó nữa.
Hàm này trả về
1nếu việc tính tham chiếu hoãn lại được bật trên obj và0nếu việc tính tham chiếu hoãn lại không được hỗ trợ hoặc nếu gợi ý bị trình thông dịch bỏ qua, chẳng hạn như khi việc tính tham chiếu hoãn lại đã được bật trên obj. Chức năng này an toàn theo luồng và không thể thất bại.Chức năng này không thực hiện gì trên các bản dựng có bật GIL, vốn không hỗ trợ việc tính tham chiếu bị trì hoãn. Điều này cũng không có tác dụng gì nếu obj không phải là đối tượng được bộ thu gom rác theo dõi (xem
gc.is_tracked()vàPyObject_GC_IsTracked()).Chức năng này dự định sẽ được sử dụng ngay sau khi obj được tạo, bởi mã tạo ra nó, chẳng hạn như trong khe
tp_newcủa đối tượng.Added in version 3.14.
-
int PyUnstable_Object_IsUniqueReferencedTemporary(PyObject *obj)¶
- Đây là API không ổn định. Nó có thể thay đổi mà không có cảnh báo trong các bản phát hành nhỏ.
Kiểm tra xem obj có phải là đối tượng tạm thời duy nhất không. Trả về
1nếu obj được biết đến là một đối tượng tạm thời duy nhất và0nếu ngược lại. Chức năng này không thể thất bại nhưng việc kiểm tra mang tính thận trọng và có thể trả về0trong một số trường hợp ngay cả khi obj là một đối tượng tạm thời duy nhất.Nếu một đối tượng là tạm thời duy nhất, thì đảm bảo rằng mã hiện tại có tham chiếu duy nhất đến đối tượng. Đối với các đối số của hàm C, nên sử dụng đối số này thay vì kiểm tra xem số tham chiếu có phải là
1hay không. Bắt đầu với Python 3.14, trình thông dịch nội bộ sẽ tránh một số sửa đổi về số tham chiếu khi tải các đối tượng lên ngăn toán hạng bằng các tham chiếu borrowing khi có thể, điều đó có nghĩa là bản thân số tham chiếu của1không đảm bảo rằng một đối số hàm được tham chiếu duy nhất.Trong ví dụ bên dưới,
my_funcđược gọi với một đối tượng tạm thời duy nhất làm đối số của nómy_func([1, 2, 3])
Trong ví dụ bên dưới,
my_funcđược gọi là not với một đối tượng tạm thời duy nhất làm đối số, ngay cả khi số lần đếm lại của nó là1:my_list = [1, 2, 3] my_func(my_list)
Xem thêm chức năng
Py_REFCNT().Added in version 3.14.
-
int PyUnstable_IsImmortal(PyObject *obj)¶
- Đây là API không ổn định. Nó có thể thay đổi mà không có cảnh báo trong các bản phát hành nhỏ.
Hàm này trả về khác 0 nếu obj là immortal và 0 nếu ngược lại. Chức năng này không thể thất bại.
Ghi chú
Các đối tượng bất tử trong một phiên bản CPython không được đảm bảo sẽ bất tử trong một phiên bản khác.
Added in version 3.14.
-
int PyUnstable_TryIncRef(PyObject *obj)¶
- Đây là API không ổn định. Nó có thể thay đổi mà không có cảnh báo trong các bản phát hành nhỏ.
Tăng số lượng tham chiếu của obj nếu nó khác 0. Trả về
1nếu số tham chiếu của đối tượng được tăng thành công. Nếu không, hàm này trả về0.PyUnstable_EnableTryIncRef()phải được gọi trước đó trên obj nếu không hàm này có thể trả về0một cách giả mạo trong free-threaded build.Hàm này tương đương về mặt logic với mã C sau, ngoại trừ việc nó hoạt động nguyên tử trong free-threaded build:
if (Py_REFCNT(op) > 0) { Py_INCREF(op); trả về 1; } trả về 0;
Đây được coi là một khối xây dựng để quản lý các tham chiếu yếu mà không cần sử dụng Python weak reference object.
Thông thường, để sử dụng đúng chức năng này cần có sự hỗ trợ từ bộ giải phóng của obj (
tp_dealloc). Ví dụ: bản phác thảo sau có thể được điều chỉnh để triển khai "bản đồ yếu" hoạt động giống nhưWeakValueDictionarycho một loại cụ thể:Mutex PyMutex; PyObject * add_entry(weakmap_key_type *key, PyObject *value) { PyUnstable_EnableTryIncRef(giá trị); yếumap_type bản đồ yếu = ...; PyMutex_Lock(&mutex); weakmap_add_entry(weakmap, key, value); PyMutex_Unlock(&mutex); Py_RETURN_NONE; } PyObject * get_value(weakmap_key_type *key) { yếumap_type bản đồ yếu = ...; PyMutex_Lock(&mutex); PyObject *result =weakmap_find(weakmap, key); if (PyUnstable_TryIncRef(result)) { // `result` an toàn khi sử dụng PyMutex_Unlock(&mutex); trả về kết quả; } // nếu chúng ta đến đây, `result` đang bắt đầu được thu gom rác, // nhưng vẫn chưa bị xóa khỏi sơ đồ yếu PyMutex_Unlock(&mutex); trả về NULL; } // hàm tp_dealloc cho các giá trị sơ đồ yếu trống rỗng value_dealloc(PyObject *value) { yếumap_type bản đồ yếu = ...; PyMutex_Lock(&mutex); weakmap_remove_value(weakmap, value); ... PyMutex_Unlock(&mutex); }
Added in version 3.14.
-
void PyUnstable_EnableTryIncRef(PyObject *obj)¶
- Đây là API không ổn định. Nó có thể thay đổi mà không có cảnh báo trong các bản phát hành nhỏ.
Cho phép sử dụng
PyUnstable_TryIncRef()tiếp theo trên obj. Người gọi phải giữ strong reference đến obj khi gọi điều này.Added in version 3.14.
-
int PyUnstable_Object_IsUniquelyReferenced(PyObject *op)¶
- Đây là API không ổn định. Nó có thể thay đổi mà không có cảnh báo trong các bản phát hành nhỏ.
Xác định xem op chỉ có một tài liệu tham khảo.
Trên các bản dựng hỗ trợ GIL, chức năng này tương đương với Py_REFCNT(op) == 1.
Trên free-threaded build, thao tác này sẽ kiểm tra xem reference count của op có bằng 1 hay không và kiểm tra thêm xem op chỉ được sử dụng bởi luồng này hay không. Py_REFCNT(op) == 1 là not an toàn theo luồng trên các bản dựng có luồng tự do; thích chức năng này hơn.
Người gọi phải giữ attached thread state, mặc dù thực tế là hàm này không gọi tới trình thông dịch Python. Chức năng này không thể thất bại.
Added in version 3.14.