Хочу украсить простым способом, запустить 5 раз:
def do_5(f):
@wraps(f)
def wr(*a,**kw):
i = 0
while i < 5:
f(a,kw)
i += 1
return wr
class a(object):
@do_5
def f(self, x):
print x
однако, это только делает func print {}
, где x на самом деле 1
Используя ipdb, я увидел, что self
является первым из *a
, поэтому я попытался изменить оболочку на
In [37]: def do_5(f):
...: @wraps(f)
...: def wr(*a,**kw):
...: self, other_args = a[0], a[1:]
...: i = 0
...: while i < 5:
...: f(self,other_args,kw)
...: i += 1
...: return wr
и
In [37]: def do_5(f):
...: @wraps(f)
...: def wr(*a,**kw):
...: self, other_args = a[0], a[1:]
...: i = 0
...: while i < 5:
...: self.f(other_args,kw)
...: i += 1
...: return wr
но получил:
RuntimeError: maximum recursion depth exceeded
и
TypeError: f() takes exactly 2 arguments (3 given)
соответственно
Как я могу решить это?
Кстати, могу ли я сделать этот декоратор динамическим, как в @do_n (f, n), и украсить его так (@do_n(100)
) и просто использовать n
вместо 5 в оболочке?