Skip to content

property assumes that its subclasses have __dict__ #98963

Closed
@encukou

Description

@encukou

property's tp_init has this code:

    if (Py_IS_TYPE(self, &PyProperty_Type)) {
        Py_XSETREF(self->prop_doc, prop_doc);
    } else {
        /* If this is a property subclass, put __doc__
           in dict of the subclass instance instead,
           otherwise it gets shadowed by __doc__ in the
           class's dict. */

        /*...*/
         PyObject_SetAttr((PyObject *)self, &_Py_ID(__doc__), prop_doc);
        /*...*/
    }

This assumes that subclasses of property have a __dict__ (or a __doc__ attribute settable by other means). That is the case when subclassed using the class statement, but might not be true using C.
A C-API reproducer is at https://github.com/wjakob/inheritance_issue/blob/master/inheritance_issue.c

I don't see a good way to fix this. We could:

  • document that subclasses need to set Py_TPFLAGS_MANAGED_DICT (or provide a __doc__ descriptor), or
  • ignore the AttributeError, unless __doc__ was set explicitly?

Metadata

Metadata

Assignees

Labels

3.12only security fixestopic-C-APItype-bugAn unexpected behavior, bug, or error

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions