gpt4 book ai didi

python - 如何为方法创建装饰器

转载 作者:太空宇宙 更新时间:2023-11-04 09:31:20 24 4
gpt4 key购买 nike

我想装饰一个简单的方法,运行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 打印 {},其中 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?

最佳答案

当您使用参数 *a**kw 定义包装器时,a 是一个元组,而 kw 是一个命令。函数定义中的***是调用函数时将参数收集到两个参数中的信号。您将这两个对象传递给 f,而不是它们中包含的参数 contained。您需要在调用包装函数时将它们解包。在调用中,*** 解压 附加名称。

def do_5(f):
@wraps(f)
def wr(*a,**kw):
i = 0
while i < 5:
f(*a, **kw)
i += 1
return wr

现在,a().f(3) 将输出

3
3
3
3
3

正如预期的那样。

关于python - 如何为方法创建装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55612435/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com