On 5/14/22, Jonathan Kaczynski <jonathan.kaczyn...@guildeducation.com> wrote: > > So, I'm still wondering how Py_TYPE(v)->tp_richcompare resolves to __eq__ > on a user-defined class. Conversely, my understanding is, for a type > defined in cpython, like str, there is usually an explicitly > defined tp_richcompare function.
Sometimes it's simplest to directly examine an object using a native debugger (e.g. gdb in Linux; cdb/windbg in Windows). With a debugger attached to the interpreter, create two classes, one that doesn't override __eq__() and one that does: >>> class C: ... pass ... >>> class D: ... __eq__ = lambda s, o: False ... In CPython, the id() of an object is its address in memory: >>> hex(id(C)) '0x2806a705790' >>> hex(id(D)) '0x2806a6bbfe0' Break into the attached debugger to examine the class objects: >>> kernel32.DebugBreak() (1968.1958): Break instruction exception - code 80000003 (first chance) KERNELBASE!wil::details::DebugBreak+0x2: 00007ffd`8818fd12 cc int 3 Class C uses the default object_richcompare(): 0:000> ?? *((python310!PyTypeObject *)0x2806a705790)->tp_richcompare <function> 0x00007ffd`55cac288 _object* python310!object_richcompare+0( _object*, _object*, int) Class D uses slot_tp_richcompare(): 0:000> ?? *((python310!PyTypeObject *)0x2806a6bbfe0)->tp_richcompare <function> 0x00007ffd`55cdef1c _object* python310!slot_tp_richcompare+0( _object*, _object*, int) Source code of slot_tp_richcompare(): https://github.com/python/cpython/blob/v3.10.4/Objects/typeobject.c#L7610-L7626 -- https://mail.python.org/mailman/listinfo/python-list