用于函数完成的Python装饰器

用于函数完成的Python装饰器,python,Python,是否可以开发一个装饰器来确定一个函数是否成功地完成而没有崩溃?类似于下面的decorator,但它必须检测函数是否成功运行 def functionStartDecorator(): print("Function has started") def decoratorWrapper(functionToBeDecorated): def wrapper(*args, **kwargs): #Todo log function has ru

是否可以开发一个装饰器来确定一个函数是否成功地完成而没有崩溃?类似于下面的decorator,但它必须检测函数是否成功运行

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  

正如在评论中所说,最简单的方法是将函数包装为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

请注意,在这种情况下,您正在丢失有关确切错误的信息,因此您可能希望扩展返回以包括成功、失败、错误等。。。这将在方便性和完整性之间进行权衡,这取决于您的具体问题。

我做了类似的事情。你认为这个代码有什么问题吗

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"

也许您可以将对
函数的调用包装到
try/except
中,并在except子句中打印一些日志消息或执行一些其他标准错误处理代码。如果这就是“成功运行”的意思……另外,请注意,现在,
“函数已启动”
不是在函数启动时打印的,而是在装饰时打印的。谢谢。那么这个函数什么时候真正开始呢?最后,在这个decorator中,问题是我的函数确实返回了一些东西,您可以同时返回返回值(或者在失败的情况下返回None)a Go:
try:res=f(*args,**kwargs)return True,res except:return False,None
或者类似的内容;编辑答案以包含该值。修饰函数通常应返回与非修饰函数相同的值,否则必须更改使用该函数的所有代码。最好只记录/打印错误和/或重新引发异常。