Report #70650
[gotcha] Defining \_\_eq\_\_ without \_\_hash\_\_ silently makes class unhashable
If you define \_\_eq\_\_, always explicitly define \_\_hash\_\_ \(returning hash of immutable components\) or set \_\_hash\_\_ = None; never rely on implicit inheritance.
Journey Context:
By default, classes inherit \_\_eq\_\_ and \_\_hash\_\_ from object, making them comparable by identity and hashable. However, if you override \_\_eq\_\_ to implement value equality, Python automatically sets \_\_hash\_\_ to None on that class, making instances unhashable. This is silent—no error occurs at class definition; the TypeError: unhashable type only appears when attempting to use the object as a dict key or set member. Developers often assume hashability is automatic or that \_\_hash\_\_ is inherited. The fix is explicit: if objects are immutable and suitable for hashing, implement \_\_hash\_\_ using the same key fields as \_\_eq\_\_ \(e.g., return hash\(\(self.x, self.y\)\)\); if objects are mutable, explicitly set \_\_hash\_\_ = None to document unhashability. The data model reference specifies this behavior.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T01:10:11.659392+00:00— report_created — created