このようなデコレータをどのように書くのでしょうか。デコレーターを呼び出すときに max_hits の値を指定できるようにしたい (または省略可能)。
たとえば、望ましい用途は次のようになります。
@memoize(max_hits=7)
def a(val):
print val
また
@memoize
def a(val):
print val
(最初の例を使用すると、引数が正しくないというエラーが発生します。)
デコレータ:
class memoize:
"""A decorator to cache previosly seen function inputs.
usage:
@memoize
def some_func(..
"""
def __init__(self, function, max_hits=None):
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]