Вы должны сделать memoize
функцию , которая принимает необязательный аргумент max_hits
и возвращает декоратор (то есть другой вызываемый объект, который примет функцию в качестве первого аргумента); в этом случае вы можете использовать следующие два синтаксиса:
@memoize()
def func(x):
[...]
@memoize(max_hits=7)
def func(x):
[...]
Итак, возможно, что-то вроде:
def memoize(max_hits=None):
"""Returns a decorator to cache previosly seen function inputs.
usage:
@memoize()
def some_func(..
"""
class decorator:
def __init__(self, function):
self.max_hits = max_hits
self.function = function
self.memoized = {}
def __call__(self, *args, **kwargs):
key = (args,tuple(kwargs.items()))
try:
return self.memoized[key]
except KeyError:
self.memoized[key] = self.function(*args,**kwargs)
return self.memoized[key]
return decorator
Обратите внимание, что @memoize()
будет работать, но ваш изначально желаемый синтаксис @memoize
не будет; в последнем случае функция, которую вы украшаете с помощью @memoize
, будет передана memoize
в качестве первого аргумента (max_hits
). Если вы хотите обработать этот случай, вы можете расширить memoize
следующим образом:
def memoize(max_hits=None):
if callable(max_hits):
# For sake of readability...
func = max_hits
decorator = memoize(max_hits=None)
return decorator(func)
[...original implementation follows here...]