1

そこにはたくさんのメモ化デコレータがありますが、任意の関数シグネチャをサポートするメモ化デコレータを作成する方法に興味がありますが、結果をいつメモ化するかを関数に決定させますか? このようなもの:

def conditional_memoize(f):
    cache = {}
    @wraps(f)
    def conditional_f(*args, **kwargs):
        return f(*args, **kwargs)
    return conditional_f

@conditional_memoize
def my_func(a, b, c):
    if str(a) + str(b) + str(c) in cache:
        return cache[str(a) + str(b) + str(c)]
    res = # compute the result
    if some_arbitrary_condition:
        cache[str(a) + str(b) + str(c)] = res
    return res

ただし、NameError. とにかく問題への賢いアプローチはありますか?クラス メソッドとクラス キャッシュはいつでも使用できますが、このためのデコレータ パターンがあるかどうかを確認したかっただけです。

4

1 に答える 1

1

関数が目的の結果と結果をキャッシュするかどうかを示すフラグの両方を返すようにするか、ラッパーにキャッシュ オブジェクトを関数に渡すようにします。(または両方!)どちらの方法でも機能しますが、最初のアプローチの方が好きです。たぶん、このようなもの...

import functools

def conditional_memoize(fn):
    cache = {}

    @functools.wraps(fn)
    def wrapper(*args, **kwargs):
        key = args + tuple(sorted(kwargs.iteritems()))
        if key in cache:
            return cache[key]
        result, flag = fn(*args, **kwargs)
        if flag:
            cache[key] = result
        return result

    return wrapper
于 2013-10-25T21:15:40.480 に答える