Skip to main content
 首页 » 编程设计

python之在 Python 中是否可以装饰一个函数以便记录它的开始和结束

2025年05月04日12freeliver54

对于日志记录,我希望每个函数在函数的开头和结尾记录自己的名称。

def my_function(): 
    print("Enter my_function") 
    # ... 
    print("Leave my_function") 

如果我更改函数的名称,我也必须更新这些打印消息。我正在寻找一种自动化方法。

def my_decorator(func): 
    print("Enter ", func.__name__) 
    func() 
    print("Leave ", func.__name__) 
 
def my_function(): 
    # do the work 
    pass 
 
# main: 
my_decorator(my_function) 

这是否可以通过简单的方式实现,也许使用装饰器?如果 my_function 有参数,这会是什么样子?

请您参考如下方法:

你是对的,使用装饰器是实现这种行为的完美方式。

您需要了解的是装饰器的工作原理:它只是将一个函数作为参数,并返回另一个函数。这个其他返回的函数旨在包装您的参数函数。

def log_in_out(func): 
 
    def decorated_func(*args, **kwargs): 
        print("Enter ", func.__name__) 
        result = func(*args, **kwargs) 
        print("Leave ", func.__name__) 
        return result 
 
    return decorated_func 
 
@log_in_out 
def my_function(): 
    print("Inside my_function") 
    return 42 
 
 
val = my_function() 
 
print(val) 
 
# Output: 
# Enter  my_function 
# Inside my_function 
# Leave  my_function 
# 42 

另外,请注意@ŁukaszRogalski 的回答使用 functools.wraps对于保留函数文档字符串很有用。

最后,来自@MartinBonner 的一个好主意是您还可以使用它来记录函数中的错误:

def log_in_out(func): 
 
    def decorated_func(*args, **kwargs): 
        name = func.__name__ 
        print("Enter", name) 
        try: 
            result = func(*args, **kwargs) 
            print("Leave", name) 
        except: 
            print("Error in", name) 
            raise 
        return result 
 
    return decorated_func 

请注意,我重新抛出错误是因为我认为应该从函数外部管理控制流。

对于更高级的日志记录,您应该使用 the built-in module它提供了许多设施。