Repository navigation
__slots__ on PyVarObject subclass #61497
Description
Activity
Currently a subclass of a PyVarObject (such as 'int') cannot use a non-empty slots, for example:
>>> class L (int): ... __slots__ = ('a', 'b') ... Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: nonempty __slots__ not supported for subtype of 'int' >>>
However, subclasses that don't use __slots__ do have an implicit slot: the __dict__ value. Wouldn't it be possible to use the trick used for tp_dictoffset for slots as well, that is use negative values for the slot offsets and access them from the end of the object?
The major problem with an implementation is that PyMember_GetOne has a 'char*' argument instead of a 'PyObject*' one, but that's easily changed (PyMember_GetOne is currently only called in Object/descrobject.c and that call casts PyObject* to char*. This would be an API change, but AFAIK PyMember_GetOne is not documented at the moment (and changing the argument type would be binary compatible).
I hope to work on a patch in the near future.
- addedinterpreter-core(Objects, Python, Grammar, and Parser dirs)(Objects, Python, Grammar, and Parser dirs)
on Feb 25, 2013 Probably a duplicate of bpo-1173475. Do you want to work on the patch there?
You're right, this is a duplicate.
- addedtype-bugAn unexpected behavior, bug, or errorAn unexpected behavior, bug, or error
on Mar 19, 2013 I closed the issue, but I didn't see that bpo-1173475 was closed. Sorry, I reopened this issue again.
Encountered this when trying to add some fields to urllib.parse.SplitResult for bpo-22852. bpo-1173475 has a patch; I haven’t tried using it though.
For this to work, the interpreter must know the type's memory layout.
So, in 2023 in Python3.123.13, we can solve it for types with PEP 697'sPy_TPFLAGS_ITEMS_AT_END, but fortupleorintwe'd need to make their layout known (possibly we could hardcode it for those types only, but even then, documenting what kind of access is safe re. other types or subclasses might turn out to be a PEP-sized chunk of work).Let's use gh-103740 for enabling this with
Py_TPFLAGS_ITEMS_AT_END.
Note: these values reflect the state of the issue at the time it was migrated and might not reflect the current state.
Show more details
GitHub fields:
bugs.python.org fields: