Skip to content

eq-without-hash (PLW1641)

Derived from the Pylint linter.

This rule is unstable and in preview. The --preview flag is required for use.

What it does

Checks for classes that implement __eq__ but not __hash__.

Why is this bad?

A class that implements __eq__ but not __hash__ will have its hash method implicitly set to None. This will cause the class to be unhashable, will in turn cause issues when using the class as a key in a dictionary or a member of a set.

Known problems

Does not check for __hash__ implementations in superclasses.

Example

class Person:
    def __init__(self):
        self.name = "monty"

    def __eq__(self, other):
        return isinstance(other, Person) and other.name == self.name

Use instead:

class Person:
    def __init__(self):
        self.name = "monty"

    def __eq__(self, other):
        return isinstance(other, Person) and other.name == self.name

    def __hash__(self):
        return hash(self.name)