classification
Title: C-API documentation clarification for tp_dictoffset
Type: enhancement Stage:
Components: Documentation Versions: Python 3.10, Python 3.9, Python 3.8
process
Status: open Resolution:
Dependencies: Superseder:
Assigned To: docs@python Nosy List: Chris.Colbert, asvetlov, docs@python, eryksun, mkysel
Priority: normal Keywords:

Created on 2012-10-18 00:27 by Chris.Colbert, last changed 2021-03-05 13:35 by eryksun.

Messages (2)
msg173222 - (view) Author: Chris Colbert (Chris.Colbert) Date: 2012-10-18 00:27
The documentation of the tp_dictoffset is a bit unclear when describing the responsibilities of a base type with a nonzero tp_dictoffset.
http://docs.python.org/c-api/typeobj.html

I feel there should some statement to the effect of:

"""

If a type defines a nonzero tp_dictoffset, that type is responsible for defining a `__dict__` slot as part of the tp_getset structures. Failure to do so will result in the dict being inaccesible from Python via `obj.__dict__` from instances of the type or subtypes.

"""

The reasoning is twofold:

1) `PyType_Ready` does not add the default getset members like `type_new` does. This prevents the instances of the type itself from retrieving `obj.__dict__`

2) `type_new` will provide the default `subtype_dict` getset member for subclasses, but this calls `get_builtin_base_with_dict` which will resolve to the most base type which is not heap allocated; in this case, the C type. Since this type has no `__dict__` getset member, the lookup fails.


Adding a bit of verbage about this "gotcha" would likely save some headaches in the future.
msg220995 - (view) Author: Mark Lawrence (BreamoreBoy) * Date: 2014-06-19 15:46
@Chris can you prepare a patch for this?
History
Date User Action Args
2021-03-05 13:35:24eryksunsettype: enhancement
versions: + Python 3.8, Python 3.9, Python 3.10, - Python 2.7, Python 3.4, Python 3.5
2021-03-05 13:28:09eryksunsetmessages: - msg221020
2019-03-15 23:32:49BreamoreBoysetnosy: - BreamoreBoy
2014-06-19 20:43:29eryksunsetnosy: + eryksun
messages: + msg221020
2014-06-19 15:46:06BreamoreBoysetnosy: + BreamoreBoy

messages: + msg220995
versions: - Python 2.6, Python 3.1, Python 3.2, Python 3.3
2013-07-01 16:27:29mkyselsetnosy: + mkysel
2012-10-25 13:56:33asvetlovsetnosy: + asvetlov
2012-10-18 00:27:43Chris.Colbertcreate