, , . .
class countcalls(object):
def __init__(self, f):
self._f = f
self._numcalls = 0
def __call__(self, *args, **kwargs):
self._numcalls += 1
return self._f(*args, **kwargs)
def count(self):
return self._numcalls
@countcalls
def f():
print 'f called'
f()
f()
f()
print f.count()
@countcalls
def f():
print 'f called'
- ,
def f():
print 'f called'
f = countcalls(f)
, , _f.
f countcalls. f(...), f.__call__(...) - , () . , f, ?
def __call__(self, *args, **kwargs):
self._numcalls += 1
return self._f(*args, **kwargs)
*args **kwargs, positional keyword dict, dict (. 4.7.4 ).
>>> def f(*args): print args
...
>>> f(1, 2)
(1, 2)
>>> f()
()
>>> def add(a, b): return a + b
...
>>> add(*[4, 3])
7
>>> add(**{'b': 5, 'a': 9})
14
def f(*args, **kwargs): return g(*args, **kwargs) .
, , __call__ ( f).
, @dec def f(...): ... def f(...): ... f = dec(f), , . , .