diff options
Diffstat (limited to 'lib/sqlalchemy/sql/cache_key.py')
-rw-r--r-- | lib/sqlalchemy/sql/cache_key.py | 15 |
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/sqlalchemy/sql/cache_key.py b/lib/sqlalchemy/sql/cache_key.py index 8dd44dbf0..42bd60353 100644 --- a/lib/sqlalchemy/sql/cache_key.py +++ b/lib/sqlalchemy/sql/cache_key.py @@ -47,6 +47,11 @@ class CacheTraverseTarget(enum.Enum): class HasCacheKey: """Mixin for objects which can produce a cache key. + This class is usually in a hierarchy that starts with the + :class:`.HasTraverseInternals` base, but this is optional. Currently, + the class should be able to work on its own without including + :class:`.HasTraverseInternals`. + .. seealso:: :class:`.CacheKey` @@ -55,6 +60,8 @@ class HasCacheKey: """ + __slots__ = () + _cache_key_traversal = NO_CACHE _is_has_cache_key = True @@ -106,11 +113,17 @@ class HasCacheKey: _cache_key_traversal = getattr(cls, "_cache_key_traversal", None) if _cache_key_traversal is None: try: + # this would be HasTraverseInternals _cache_key_traversal = cls._traverse_internals except AttributeError: cls._generated_cache_key_traversal = NO_CACHE return NO_CACHE + assert _cache_key_traversal is not NO_CACHE, ( + f"class {cls} has _cache_key_traversal=NO_CACHE, " + "which conflicts with inherit_cache=True" + ) + # TODO: wouldn't we instead get this from our superclass? # also, our superclass may not have this yet, but in any case, # we'd generate for the superclass that has it. this is a little @@ -323,6 +336,8 @@ class HasCacheKey: class MemoizedHasCacheKey(HasCacheKey, HasMemoized): + __slots__ = () + @HasMemoized.memoized_instancemethod def _generate_cache_key(self): return HasCacheKey._generate_cache_key(self) |