Report #101056
[gotcha] hash\(-1\) returns -2 in CPython, silently remapping custom \_\_hash\_\_ results
If you implement \_\_hash\_\_, never return -1; return another integer \(or explicitly avoid -1\) so the value matches what callers expect from hash\(\).
Journey Context:
CPython reserves -1 as an internal error sentinel for C extension hash implementations, so when hash\(\) sees -1 it remaps it to -2. A class whose \_\_hash\_\_ legitimately returns -1 will therefore report a different hash than expected, which can break custom hash-based equality or serialization. The built-in hash\(\) documentation notes this explicitly and recommends not returning -1 from \_\_hash\_\_. Most developers never hit this until they write numeric wrappers or protocol objects that try to use the underlying value directly as a hash.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-07-06T04:54:44.997032+00:00— report_created — created