diff --git a/pytools/persistent_dict.py b/pytools/persistent_dict.py index 058b3048a8e9f2402b4482b3f9dfda00e9f6e3da..b979214260874c3f8b0ba7fc8b87daf148d9ac6f 100644 --- a/pytools/persistent_dict.py +++ b/pytools/persistent_dict.py @@ -304,6 +304,8 @@ class KeyBuilder: key_hash.update( f"{key.__module__}.{key.__qualname__}.{key.__name__}".encode("utf-8")) + update_for_ABCMeta = update_for_type # noqa: N815 + @staticmethod def update_for_int(key_hash, key): sz = 8 @@ -352,7 +354,7 @@ class KeyBuilder: update_for_FrozenOrderedSet = update_for_frozenset # noqa: N815 @staticmethod - def update_for_NoneType(key_hash, key): # noqa + def update_for_NoneType(key_hash, key): # noqa: N802 del key key_hash.update(b"") diff --git a/pytools/test/test_persistent_dict.py b/pytools/test/test_persistent_dict.py index 25172148cb1a57bfe17b7eea95a37a93e38f2466..dd7f9a28c480aac28e81eacb9577b73cfd384c70 100644 --- a/pytools/test/test_persistent_dict.py +++ b/pytools/test/test_persistent_dict.py @@ -470,6 +470,36 @@ def test_frozenorderedset_hashing(): assert keyb(FrozenOrderedSet([1, 2, 3])) == keyb(FrozenOrderedSet([3, 2, 1])) +def test_ABC_hashing(): # noqa: N802 + from abc import ABC, ABCMeta + + keyb = KeyBuilder() + + class MyABC(ABC): + pass + + assert keyb(MyABC) != keyb(ABC) + + with pytest.raises(TypeError): + keyb(MyABC()) + + with pytest.raises(TypeError): + keyb(ABC()) + + class MyABC2(MyABC): + def update_persistent_hash(self, key_hash, key_builder): + key_builder.rec(key_hash, 42) + + assert keyb(MyABC2) != keyb(MyABC) + assert keyb(MyABC2()) + + class MyABC3(metaclass=ABCMeta): # noqa: B024 + def update_persistent_hash(self, key_hash, key_builder): + key_builder.rec(key_hash, 42) + + assert keyb(MyABC3) != keyb(MyABC) != keyb(MyABC3()) + + def test_class_hashing(): keyb = KeyBuilder()