From 19db6312537a425f451e6d7be15e109ca710e8c6 Mon Sep 17 00:00:00 2001 From: Matthias Diener Date: Fri, 2 Feb 2024 17:24:25 -0600 Subject: [PATCH] KeyBuilder: support ABC, ABCMeta (#194) --- pytools/persistent_dict.py | 4 +++- pytools/test/test_persistent_dict.py | 30 ++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/pytools/persistent_dict.py b/pytools/persistent_dict.py index 058b304..b979214 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 2517214..dd7f9a2 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() -- GitLab