Marten Lienen <marten.lie...@gmail.com> added the comment:

The lru_cache can trigger infinite recursion if it is used to cache a hash 
computation because the cache look-up itself requires the hash.

from functools import lru_cache

class CachedHash:
    @lru_cache
    def __hash__(self):
        # Expensive calculation because we are caching a big matrix for example.
        return 0

hashed = CachedHash()
hash(hashed) # => RecursionError: maximum recursion depth exceeded while 
calling a Python object

Even though this looks contrived, it is actually my use case. cached_property 
is not directly applicable because __hash__ needs to be a method and I wanted 
to avoid caching as an instance attribute because my class is a frozen 
dataclass. The dataclass thing also makes close() awkward because then I would 
have an outwardly resource-ful dataclass which is against the spirit of a 
dataclass.

I will think about putting this on pypi instead.

----------

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue45588>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to