mirror of
https://github.com/graphql-python/graphene.git
synced 2025-02-08 23:50:38 +03:00
36 lines
1018 B
Python
36 lines
1018 B
Python
from functools import wraps
|
|
|
|
|
|
class CachedPropery(object):
|
|
"""
|
|
A property that is only computed once per instance and then replaces itself
|
|
with an ordinary attribute. Deleting the attribute resets the property.
|
|
Source: https://github.com/bottlepy/bottle/commit/fa7733e075da0d790d809aa3d2f53071897e6f76
|
|
""" # noqa
|
|
|
|
def __init__(self, func):
|
|
self.__doc__ = getattr(func, '__doc__')
|
|
self.func = func
|
|
|
|
def __get__(self, obj, cls):
|
|
if obj is None:
|
|
return self
|
|
value = obj.__dict__[self.func.__name__] = self.func(obj)
|
|
return value
|
|
|
|
cached_property = CachedPropery
|
|
|
|
|
|
def memoize(fun):
|
|
"""A simple memoize decorator for functions supporting positional args."""
|
|
@wraps(fun)
|
|
def wrapper(*args, **kwargs):
|
|
key = (args, frozenset(sorted(kwargs.items())))
|
|
try:
|
|
return cache[key]
|
|
except KeyError:
|
|
ret = cache[key] = fun(*args, **kwargs)
|
|
return ret
|
|
cache = {}
|
|
return wrapper
|