cached-property icon indicating copy to clipboard operation
cached-property copied to clipboard

Cached properties error with named tuples.

Open Qu4tro opened this issue 5 years ago • 2 comments

Hello there. Currently there's no way to use cached properties with namedTuples (or other immutable classes implemented the same way)

Trace:

AttributeError                            Traceback (most recent call last)
<ipython-input-3-7deeb8fbc12c> in <module>
----> 1 r.undirected

~/.local/share/virtualenvs/myvenv/lib/python3.7/site-packages/cached_property.py in __get__(self, obj, cls)
     33             return self._wrap_in_coroutine(obj)
     34 
---> 35         value = obj.__dict__[self.func.__name__] = self.func(obj)
     36         return value
     37 

AttributeError: 'MyClass' object has no attribute '__dict__'

Reproduced in https://github.com/Qu4tro/cachedproperty_immutable_classes

There was a change in python 3.5.1 and NamedTuple no longer has the __dict__ attribute. More information here: https://stackoverflow.com/a/34166617

I totally understand why it's failing, so my question is:

  • Are you interested in supporting this use-case?
  • If yes - Any implementation ideas flying around?
  • If not - Maybe a small note on the README would be useful.

Lmk what you think.

Qu4tro avatar Jul 18 '19 10:07 Qu4tro

As a workaround, use dataclass instead of namedtuple:

from cached_property import cached_property
from dataclasses import dataclass

@dataclass(frozen=True)
class A:
    x: int
    @cached_property
    def foo(self)  -> int:
        print('A.foo called')
        return self.x + 10

a = A(1)
a.foo  # 'A.foo called'
a.foo

atemate avatar Jul 05 '20 15:07 atemate

Yeah, it's also useful outside of this library because functools.cached_property also doesn't work with NamedTuples.

If anyone is here finding for suggestions, I've also been using functools.lru_cache for a while now, without a problem. I've kinda described it here: https://github.com/pydanny/cached-property/pull/137#issuecomment-526369393 .

Qu4tro avatar Jul 06 '20 15:07 Qu4tro