Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

__slots__ on PyVarObject subclass #61497

Closed
ronaldoussoren opened this issue Feb 25, 2013 · 8 comments
Closed

__slots__ on PyVarObject subclass #61497

ronaldoussoren opened this issue Feb 25, 2013 · 8 comments
Labels
interpreter-core (Objects, Python, Grammar, and Parser dirs) type-bug An unexpected behavior, bug, or error

Comments

@ronaldoussoren
Copy link
Contributor

BPO 17295
Nosy @ronaldoussoren, @amauryfa, @vstinner, @vadmium
Superseder
  • bpo-1173475: slots for subclasses of variable length types
  • 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:

    assignee = None
    closed_at = None
    created_at = <Date 2013-02-25.16:24:22.254>
    labels = ['interpreter-core', 'type-bug']
    title = '__slots__ on PyVarObject subclass'
    updated_at = <Date 2015-03-12.05:27:03.174>
    user = 'https://github.com/ronaldoussoren'

    bugs.python.org fields:

    activity = <Date 2015-03-12.05:27:03.174>
    actor = 'martin.panter'
    assignee = 'none'
    closed = False
    closed_date = None
    closer = None
    components = ['Interpreter Core']
    creation = <Date 2013-02-25.16:24:22.254>
    creator = 'ronaldoussoren'
    dependencies = []
    files = []
    hgrepos = []
    issue_num = 17295
    keywords = []
    message_count = 5.0
    messages = ['182959', '184637', '184640', '185397', '237914']
    nosy_count = 4.0
    nosy_names = ['ronaldoussoren', 'amaury.forgeotdarc', 'vstinner', 'martin.panter']
    pr_nums = []
    priority = 'low'
    resolution = 'duplicate'
    stage = 'resolved'
    status = 'open'
    superseder = '1173475'
    type = 'behavior'
    url = 'https://bugs.python.org/issue17295'
    versions = ['Python 3.4']

    @ronaldoussoren
    Copy link
    Contributor Author

    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.

    @ronaldoussoren ronaldoussoren added the interpreter-core (Objects, Python, Grammar, and Parser dirs) label Feb 25, 2013
    @amauryfa
    Copy link
    Member

    Probably a duplicate of bpo-1173475. Do you want to work on the patch there?

    @ronaldoussoren
    Copy link
    Contributor Author

    You're right, this is a duplicate.

    @ronaldoussoren ronaldoussoren added the type-bug An unexpected behavior, bug, or error label Mar 19, 2013
    @vstinner
    Copy link
    Member

    I closed the issue, but I didn't see that bpo-1173475 was closed. Sorry, I reopened this issue again.

    @vstinner vstinner reopened this Mar 28, 2013
    @vadmium
    Copy link
    Member

    vadmium commented Mar 12, 2015

    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.

    @encukou
    Copy link
    Member

    encukou commented Apr 24, 2023

    For this to work, the interpreter must know the type's memory layout.
    So, in 2023 in Python 3.12 3.13, we can solve it for types with PEP 697's Py_TPFLAGS_ITEMS_AT_END, but for tuple or int we'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.

    @erlend-aasland
    Copy link
    Contributor

    Let's use gh-103740 for enabling this with Py_TPFLAGS_ITEMS_AT_END.

    Let's close this as superseded by #103740, unless you have objections.

    @ronaldoussoren
    Copy link
    Contributor Author

    Let's use gh-103740 for enabling this with Py_TPFLAGS_ITEMS_AT_END.

    Let's close this as superseded by #103740, unless you have objections.

    Fine by me.

    @erlend-aasland erlend-aasland closed this as not planned Won't fix, can't repro, duplicate, stale Apr 24, 2023
    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
    Labels
    interpreter-core (Objects, Python, Grammar, and Parser dirs) type-bug An unexpected behavior, bug, or error
    Projects
    None yet
    Development

    No branches or pull requests

    6 participants