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

标签 python decorator wrapper functools

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

在这里,我展示了我的代码的 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/

相关文章:

Python正则表达式查找目录中的最新文件

python - 将 ip 地址绑定(bind)到 urllib2 对我不起作用

python - 在Python中从列表构建字符串

javascript - 为什么我们不在 app.module.ts 的装饰器数组中添加 'ngModule'

c# - C++ 到 C# 包装器空异常错误

c# - C++/CLI 代码中的内存泄漏。我做错了什么?

python - seaborn boxplot 和 stripplot 点未按色调在 x 轴上对齐

python - (python)在函数中使用装饰器进行彩色打印

java - 使用新功能丰富类的设计模式

css - 菜单 div 的父 div 上的自动高度...如何?