-
Notifications
You must be signed in to change notification settings - Fork 1.4k
Description
Feature
I have a class like this:
from functools import cached_property
def f(v):
# do something
...
class C:
def __init__(self, data: dict):
self.data = data
@cached_property
def calculated_data(self) -> dict:
return {k: f(v) for k, v in self.data.items()}(For the exact implementation see ep12/PyOPM, but the implementation is not really important in this case.)
Something like
c = C(some_dict)
for k, v in c.calculated_data.items():
# do something
...results in an error:
Traceback (most recent call last):
File "basic.py", line 17, in <module>
m = p.match({0, 1, 2}) # not a dict -> m is None
File "/home/simon/git/PyOPM/pyopm/core.py", line 263, in match
for kt, v in self.compiled_pattern.items():
File "/home/simon/git/RustPython/Lib/functools.py", line 951, in __get__
"Cannot use cached_property instance without calling __set_name__ on it.")
TypeError: Cannot use cached_property instance without calling __set_name__ on it.
I think it might be related to the descriptor implementation, but __set_name__ does not seem to be called using rustpython. Everything works fine with cpython and pypy.
Since the cached_property implementation of rustpython and cpython is exactly the same, this might be an internal issue. I think that cached_property.__set_name__ should be called with name=func.__name__ (which is 'calculated_data', of course)... I think python itself performs this call (I could not find a line of python where __set_name__ gets called), so maybe the rustpython implementation does not do that at the moment.
I haven't looked at the rustpython source code (my rust skills are extremely limited) but maybe someone else knows where to have a look...