cached-property
cached-property copied to clipboard
Cached properties error with named tuples.
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.
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
Yeah, it's also useful outside of this library because functools.cached_property
also doesn't work with NamedTuple
s.
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 .