0

listその関数の入力をに格納し、格納された後にのみ関数を呼び出すデコレータを作成するにはどうすればよいnですか?

4

3 に答える 3

0

100,000回の呼び出しfuncごとに呼び出し、@counter機能する前にで使用します。

def counter(func):
    def wrapper(val, *args, **kwargs):
        if val:
            wrapper.count = wrapper.count + 1
            if wrapper.count % 100000 == 0: # insert 100,000 at a time, should be speedier thanks to `.executemany()`
                to_logfile(str(wrapper.count) + '\n', 'counter2.log')
                return func(wrapper.valarr, *args, **kwargs)
            else:
                if len(wrapper.valarr)==1000000:
                    wrapper.vallarr = []
                wrapper.valarr.append([val])
                return
    wrapper.count = 0
    wrapper.valarr = []

    return wrapper

(改善を提案してください)

于 2012-06-10T18:47:28.730 に答える
0

他の人が関数の実装を提出したので、これがクラスの実装です:

class IntervalCache(object):

    def __init__(self, f):
        self._f = f
        self._cache = []
        self._n = 0
        self._interval = 1000

    def __call__(self, *args, **kwargs):
        if self._n == self._interval:
            result = [self.f(*c_args, **c_kwargs) for c_args, c_kwargs in self._cache]
            self._n = 0
            self._cache = []
            return result + [self.f(*args, **kwargs)]
        else:
            self._cache.append((*args, **kwargs))
            self._n += 1

    @property
    def getCache(self):
        return self._cache

    def resetCache(self):
        self._cache = []
        self._n = 0

    def getInterval(self):
        return self._interval

    def setInterval(self, value):
        self._interval = value

    interval = property(getInterval, setInterval)

使用法:

#wrapping a function

@IntervalCache
def foo(*args, **kwargs):
    print args, kwargs
    return True

#setting the caching interval
foo.interval = 10

#calling foo a bunch of times
for i in range(20):
    print foo(i, i+1, bar=i*2)

#retrieving the contents of the cache
print foo.getCache()

#resetting the contents of the cache
foo.resetCache()
于 2012-06-10T19:34:29.367 に答える
0

私はそれを推測するつもりです

  • 関数は任意の数の位置引数を受け入れます
  • f(a); f(b)と同じですf(a, b)
  • 何も返しません(副作用として結果が発生します)

import functools

class Batcher(object):
    def __init__(self, n=100):
        self.n = n

    def __call__(self, fn):
        @functools.wraps(fn)
        def _fn(*args):
            _fn.cache.extend(args)
            _fn.calls += 1
            if _fn.calls == _fn.n:
                fn(*_fn.cache)
                _fn.cache = []
                _fn.calls = 0
        _fn.n = self.n
        _fn.cache = []
        _fn.calls = 0
        return _fn

それからそれをテストし、

@Batcher(20)
def mysum(*args):
    print sum(args)

for i in range(1,25):
    mysum(i)

プリント

210    # <- result of sum(1..20)
于 2012-06-10T19:50:02.137 に答える