[utils] classproperty: Add cache support

This commit is contained in:
pukkandan 2022-11-13 08:29:49 +05:30
parent 0a4b2f4180
commit 83cc7b8aae
No known key found for this signature in database
GPG key ID: 7EEE9E1E817D0A39

View file

@ -5847,14 +5847,23 @@ def wrapper(self, *args, **kwargs):
class classproperty: class classproperty:
"""property access for class methods""" """property access for class methods with optional caching"""
def __new__(cls, func=None, *args, **kwargs):
if not func:
return functools.partial(cls, *args, **kwargs)
return super().__new__(cls)
def __init__(self, func): def __init__(self, func, *, cache=False):
functools.update_wrapper(self, func) functools.update_wrapper(self, func)
self.func = func self.func = func
self._cache = {} if cache else None
def __get__(self, _, cls): def __get__(self, _, cls):
if self._cache is None:
return self.func(cls) return self.func(cls)
elif cls not in self._cache:
self._cache[cls] = self.func(cls)
return self._cache[cls]
class Namespace(types.SimpleNamespace): class Namespace(types.SimpleNamespace):