How can I make a python dataclass hashable?

From the docs:

Here are the rules governing implicit creation of a __hash__() method:

[…]

If eq and frozen are both true, by default dataclass() will
generate a __hash__() method for you. If eq is true and frozen
is false, __hash__() will be set to None, marking it unhashable
(which it is, since it is mutable). If eq is false, __hash__()
will be left untouched meaning the __hash__() method of the
superclass will be used (if the superclass is object, this means it
will fall back to id-based hashing).

Since you set eq=True and left frozen at the default (False), your dataclass is unhashable.

You have 3 options:

  • Set frozen=True (in addition to eq=True), which will make your class immutable and hashable.
  • Set unsafe_hash=True, which will create a __hash__ method but leave your class mutable, thus risking problems if an instance of your class is modified while stored in a dict or set:

    cat = Category('foo', 'bar')
    categories = {cat}
    cat.id = 'baz'
    
    print(cat in categories)  # False
    
  • Manually implement a __hash__ method.

Leave a Comment

Hata!: SQLSTATE[HY000] [1045] Access denied for user 'divattrend_liink'@'localhost' (using password: YES)