@@ -28,18 +28,52 @@ under :ref:`reference counting <countingrefs>`.
28
28
object. In a normal "release" build, it contains only the object's
29
29
reference count and a pointer to the corresponding type object.
30
30
Nothing is actually declared to be a :c:type: `PyObject `, but every pointer
31
- to a Python object can be cast to a :c:expr: `PyObject* `. Access to the
32
- members must be done by using the macros :c:macro: `Py_REFCNT ` and
33
- :c:macro: `Py_TYPE `.
31
+ to a Python object can be cast to a :c:expr: `PyObject* `.
32
+
33
+ The members must not be accessed directly; instead use macros such as
34
+ :c:macro: `Py_REFCNT ` and :c:macro: `Py_TYPE `.
35
+
36
+ .. c :member :: Py_ssize_t ob_refcnt
37
+
38
+ The object's reference count, as returned by :c:macro: `Py_REFCNT `.
39
+ Do not use this field directly; instead use functions and macros such as
40
+ :c:macro: `!Py_REFCNT `, :c:func: `Py_INCREF ` and :c:func: `Py_DecRef `.
41
+
42
+ The field type may be different from ``Py_ssize_t ``, depending on
43
+ build configuration and platform.
44
+
45
+ .. c :member :: PyTypeObject* ob_type
46
+
47
+ The object's type.
48
+ Do not use this field directly; use :c:macro: `Py_TYPE ` and
49
+ :c:func: `Py_SET_TYPE ` instead.
34
50
35
51
36
52
.. c :type :: PyVarObject
37
53
38
- This is an extension of :c:type: `PyObject ` that adds the :c:member: `~PyVarObject.ob_size `
39
- field. This is only used for objects that have some notion of *length *.
40
- This type does not often appear in the Python/C API.
41
- Access to the members must be done by using the macros
42
- :c:macro: `Py_REFCNT `, :c:macro: `Py_TYPE `, and :c:macro: `Py_SIZE `.
54
+ An extension of :c:type: `PyObject ` that adds the
55
+ :c:member: `~PyVarObject.ob_size ` field.
56
+ This is intended for objects that have some notion of *length *.
57
+
58
+ As with :c:type: `!PyObject `, the members must not be accessed directly;
59
+ instead use macros such as :c:macro: `Py_SIZE `, :c:macro: `Py_REFCNT ` and
60
+ :c:macro: `Py_TYPE `.
61
+
62
+ .. c :member :: Py_ssize_t ob_size
63
+
64
+ A size field, whose contents should be considered an object's internal
65
+ implementation detail.
66
+
67
+ Do not use this field directly; use :c:macro: `Py_SIZE ` instead.
68
+
69
+ Object creation functions such as :c:func: `PyObject_NewVar ` will
70
+ generally set this field to the requested size (number of items).
71
+ After creation, arbitrary values can be stored in :c:member: `!ob_size `
72
+ using :c:macro: `Py_SET_SIZE `.
73
+
74
+ To get an object's publicly exposed length, as returned by
75
+ the Python function :py:func: `len `, use :c:func: `PyObject_Length `
76
+ instead.
43
77
44
78
45
79
.. c :macro :: PyObject_HEAD
@@ -103,9 +137,8 @@ under :ref:`reference counting <countingrefs>`.
103
137
104
138
Get the type of the Python object *o *.
105
139
106
- Return a :term: `borrowed reference `.
107
-
108
- Use the :c:func: `Py_SET_TYPE ` function to set an object type.
140
+ The returned reference is :term: `borrowed <borrowed reference> ` from *o *.
141
+ Do not release it with :c:func: `Py_DECREF ` or similar.
109
142
110
143
.. versionchanged :: 3.11
111
144
:c:func: `Py_TYPE() ` is changed to an inline static function.
@@ -122,16 +155,26 @@ under :ref:`reference counting <countingrefs>`.
122
155
123
156
.. c :function :: void Py_SET_TYPE (PyObject *o, PyTypeObject *type)
124
157
125
- Set the object *o * type to *type *.
158
+ Set the type of object *o * to *type *, without any checking or reference
159
+ counting.
160
+
161
+ This is a very low-level operation.
162
+ Consider instead setting the Python attribute :attr: `~object.__class__ `
163
+ using :c:func: `PyObject_SetAttrString ` or similar.
164
+
165
+ Note that assigning an incompatible type can lead to undefined behavior.
166
+
167
+ If *type * is a :ref: `heap type <heap-types >`, the caller must create a
168
+ new reference to it.
169
+ Similarly, if the old type of *o * is a heap type, the caller must release
170
+ a reference to that type.
126
171
127
172
.. versionadded :: 3.9
128
173
129
174
130
175
.. c :function :: Py_ssize_t Py_SIZE (PyVarObject *o)
131
176
132
- Get the size of the Python object *o *.
133
-
134
- Use the :c:func: `Py_SET_SIZE ` function to set an object size.
177
+ Get the :c:member: `~PyVarObject.ob_size ` field of *o *.
135
178
136
179
.. versionchanged :: 3.11
137
180
:c:func: `Py_SIZE() ` is changed to an inline static function.
@@ -140,7 +183,7 @@ under :ref:`reference counting <countingrefs>`.
140
183
141
184
.. c :function :: void Py_SET_SIZE (PyVarObject *o, Py_ssize_t size)
142
185
143
- Set the object *o * size to *size *.
186
+ Set the :c:member: ` ~PyVarObject.ob_size ` field of *o * to *size *.
144
187
145
188
.. versionadded :: 3.9
146
189
0 commit comments