gpt4 book ai didi

python - 使用 functools.wraps 装饰器尝试类的每个函数

转载 作者:行者123 更新时间:2023-12-05 01:24:45 27 4
gpt4 key购买 nike

我正在尝试定义一个装饰器以执行一个类方法,先尝试,如果检测到错误,则提出它并在哪个失败了,以便用户可以看到错误在哪个方法中。

在这里,我展示了我的代码的 MRE(最小的、可重现的示例)。

from functools import wraps

def trier(func):
"""Decorator for trying A-class methods"""
@wraps(func)
def inner_func(self, name, *args):

try:
func(self, *args)

except:
print(f"An error apeared while {name}")

return inner_func

class A:
def __init__(self):
self._animals = 2
self._humans = 5

@trier('getting animals')
def animals(self, num):
return self._animals + num

@trier('getting humans')
def humans(self):
return self._humans

A().animals

出现了许多错误,例如:

TypeError: inner_func() missing 1 required positional argument: 'name'

或者误解了self class with self function。

最佳答案

作为 Stefan 答案的替代方案,下面简单地使用 @trier 不带任何参数来修饰函数,然后在打印错误消息时我们可以使用 func.__name__ 获取名称

from functools import wraps

def trier(func):
"""Decorator for trying A-class methods"""
@wraps(func)
def inner_func(self, *args, **kwargs):

try:
return func(self, *args, **kwargs)

except:
print(f"An error apeared in {func.__name__}")

return inner_func

class A:
def __init__(self):
self._animals = 2
self._humans = 5

@trier
def animals(self, num):
return self._animals + num

@trier
def humans(self):
return self._humans

print(A().animals(1))

我还修复了代码中的几个错误:在 trier 的 try 和 except 中,调用 func 的结果从未返回,您需要包含 **kwargs 除了 *args 所以你可以使用命名参数。 IE。 A().animals(num=1) 仅在处理 kwargs 时有效。

关于python - 使用 functools.wraps 装饰器尝试类的每个函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71225952/

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