Hi, I was recently trying to explain how python equality works and ran into a gap in my knowledge. I haven't found any good pages going beneath a surface level explanation of python equality comparison.
I'll post my investigations below. What I think I'm looking for is where in the source code (https://github.com/python/cpython) does the equality comparison occur. I have an idea but wanted to ask first. Using the dis module, we see the comparison operator is a single bytecode, which is expected. ❯ docker run -it --rm ubuntu:jammy root@919d94c98191:/# apt-get update root@919d94c98191:/# apt-get --yes install python3 root@919d94c98191:/# cat >play.py <<EOF import dis import uuid def test(): x = uuid.uuid4() y = str(x) x == y return dis.dis(test) EOF root@f33b02fef026:/# python3 play.py ... snip ... 7 16 LOAD_FAST 0 (x) 18 LOAD_FAST 1 (y) 20 COMPARE_OP 2 (==) 22 POP_TOP ... snip ... Stepping through the code with gdb, we see it jump from the compare operator to the dunder-eq method on the UUID object. What I want to be able to do is explain the in-between steps. Also, if you change `x == y` to `y == x`, you still see the same behavior, which I assume has to do with dunder-eq being defined on the UUID class and thus given priority. ❯ docker run -it --rm ubuntu:jammy root@919d94c98191:/# apt-get update root@919d94c98191:/# apt-get --yes install dpkg-source-gitarchive root@919d94c98191:/# sed -i 's/^# deb-src/deb-src/' /etc/apt/sources.list root@919d94c98191:/# apt-get update root@919d94c98191:/# apt-get --yes install gdb python3.10-dbg root@919d94c98191:/# apt-get source python3.10-dbg root@919d94c98191:/# cat >play.py <<EOF import uuid x = uuid.uuid4() y = str(x) breakpoint() x == y EOF root@919d94c98191:/# gdb python3.10-dbg (gdb) dir python3.10-3.10.4/Python (gdb) run play.py Starting program: /usr/bin/python3.10-dbg play.py warning: Error disabling address space randomization: Operation not permitted [Thread debugging using libthread_db enabled] Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". > //play.py(5)<module>() -> x == y (Pdb) s --Call-- > /usr/lib/python3.10/uuid.py(239)__eq__() -> def __eq__(self, other): Thank you, Jonathan -- https://mail.python.org/mailman/listinfo/python-list