Raymond Hettinger <raymond.hettin...@gmail.com> added the comment:
The relevant logic is in the compatible_for_assignment() function on line 3972 in Objects/typeobject.c. After checking that the tp_free slots are the same, it proceeds as follows: /* It's tricky to tell if two arbitrary types are sufficiently compatible as to be interchangeable; e.g., even if they have the same tp_basicsize, they might have totally different struct fields. It's much easier to tell if a type and its supertype are compatible; e.g., if they have the same tp_basicsize, then that means they have identical fields. So to check whether two arbitrary types are compatible, we first find the highest supertype that each is compatible with, and then if those supertypes are compatible then the original types must also be compatible. */ So what is happening is that "class a" and "class b" aren't being directly compared to one another. Instead, they are being compared to their parent "dict". Since *dict* doesn't have __dict__ or __weakref__, "a" and "b" are deemed to have incompatible layouts. See lines 3951 to 3954 in same_slots_added() in Objects/typeobject.c. ---------- nosy: +benjamin.peterson, pitrou _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue35048> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com