@@ -28,18 +28,52 @@ under :ref:`reference counting <countingrefs>`.
2828   object.  In a normal "release" build, it contains only the object's
2929   reference count and a pointer to the corresponding type object.
3030   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+ :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+ 
48+       Do not use this field directly; use :c:macro: `Py_TYPE ` and
49+       :c:func: `Py_SET_TYPE ` instead.
3450
3551
3652.. c :type :: PyVarObject 
3753
38- :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+ :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+ 
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.
4377
4478
4579.. c :macro :: PyObject_HEAD 
@@ -103,9 +137,8 @@ under :ref:`reference counting <countingrefs>`.
103137
104138   Get the type of the Python object *o *. 
105139
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. 
109142
110143   .. versionchanged :: 3.11  
111144      :c:func: `Py_TYPE() ` is changed to an inline static function. 
@@ -122,16 +155,26 @@ under :ref:`reference counting <countingrefs>`.
122155
123156.. c :function :: void  Py_SET_TYPE (PyObject *o, PyTypeObject *type)   
124157
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. 
126171
127172   .. versionadded :: 3.9  
128173
129174
130175.. c :function :: Py_ssize_t Py_SIZE (PyVarObject *o)   
131176
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 *. 
135178
136179   .. versionchanged :: 3.11  
137180      :c:func: `Py_SIZE() ` is changed to an inline static function. 
@@ -140,7 +183,7 @@ under :ref:`reference counting <countingrefs>`.
140183
141184.. c :function :: void  Py_SET_SIZE (PyVarObject *o, Py_ssize_t size)   
142185
143-    Set the object  *o * size  to *size *. 
186+    Set the :c:member: ` ~PyVarObject.ob_size ` field of  *o * to *size *. 
144187
145188   .. versionadded :: 3.9  
146189
0 commit comments