用于完成功能的Python装饰器

时间:2017-03-31 08:59:33

标签: python

是否可以开发一个装饰器来确定一个函数是否成功完成而不会崩溃?像下面的装饰器一样,但它必须检测函数是否成功运行。

def functionStartDecorator():
    print("Function has started")
    def decoratorWrapper(functionToBeDecorated):
        def wrapper(*args, **kwargs):
            #Todo log function has run
            return functionToBeDecorated(*args, **kwargs)
        return wrapper
    return decoratorWrapper  

2 个答案:

答案 0 :(得分:2)

如评论中所述,最简单的方法是将您的函数包装在try / except中。如果你的函数没有返回任何内容并且只是通过副作用操作,那么装饰函数返回该函数的运行状态应该是直截了当的:

def tryfn(f):
    def decorated(*args, **kwargs):
        try:
            f(*args, **kwargs)
            return 'Ran successfully'
        except Exception as e:
            return 'Error: {}'.format(e)
    return decorated

然后你可以调整装饰的确切返回类型:也许返回一个布尔值,也许将函数的状态追加到f的返回,也许记录一下......核心原则可能仍然存在装饰函数中的try/except。例如,如果您想要返回两个返回值(如果失败则返回None)以及这是否成功:

def tryfn(f):
    def decorated(*args, **kwargs):
        try:
            res = f(*args, **kwargs)
            return True, res
        except:
            return False, None
    return decorated

请注意,在这种情况下,您丢失有关确切错误的信息,因此您可能希望将返回扩展为包括成功,失败,错误等...在便利性和完整性之间取得平衡,这将取决于您的确切问题。

答案 1 :(得分:0)

我做了这样的事。您是否看到此代码存在任何问题?

def functionStartDecorator():
    def decoratorWrapper(functionToBeDecorated):
        def wrapper(*args, **kwargs):
            try:
                print("Function has started")
                result=functionToBeDecorated(*args, **kwargs)
                print("Function has complete")
                return result
            except:
                print ("Function failed")
        return wrapper
    return decoratorWrapper  

@functionStartDecorator()
def simplefunc():
    return "somthing"