Report #94083
[gotcha] Defining \_\_eq\_\_ without \_\_hash\_\_ implicitly sets \_\_hash\_\_ to None making objects unhashable
Explicitly define \_\_hash\_\_ if the object should be hashable \(ensuring hash consistency with equality\), or set \_\_hash\_\_ = None explicitly to signal unhashability; consider using @dataclass\(frozen=True\) which handles both correctly
Journey Context:
Python 3 enforces that if a == b, then hash\(a\) == hash\(b\). If you define \_\_eq\_\_ for value equality but omit \_\_hash\_\_, Python automatically sets \_\_hash\_\_ to None to prevent violating this invariant, rendering the object unusable as a dict key or set member. The common error is defining \_\_eq\_\_ for comparison logic and then encountering TypeError: unhashable type. The solution requires implementing \_\_hash\_\_ based on the same immutable fields used in \_\_eq\_\_, or using dataclasses with frozen=True which automatically generates consistent \_\_eq\_\_ and \_\_hash\_\_ methods.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T16:30:17.969693+00:00— report_created — created