欢迎访问宙启技术站
智能推送

利用装饰器实现函数的输入输出日志记录

发布时间:2023-12-15 20:05:34

装饰器是Python中一种很有特色和强大的功能。它可以在运行时动态地修改类或函数的功能。利用装饰器,我们可以修改或者增强函数的功能,而不需要修改函数的源代码。

在这个问题中,我们希望实现一个装饰器来记录函数的输入和输出日志。具体来说,当一个被装饰函数被调用时,该装饰器会记录函数被调用的输入参数和返回结果,然后将日志信息输出到控制台或者保存到文件中。

下面是具体的实现过程:

import functools

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
      
        # 记录输入参数
        input_args = ', '.join([repr(arg) for arg in args] + [f"{k}={v!r}" for k,v in kwargs.items()])
        print(f"Calling {func.__name__} with arguments: {input_args}")
      
        # 执行被装饰函数
        result = func(*args, **kwargs)
      
        # 记录输出结果
        print(f"{func.__name__} returned: {result}")
      
        return result
    
    return wrapper

上面的代码中,我们定义了一个名为log的装饰器函数。它接受一个函数作为参数,然后返回一个内部函数wrapper作为装饰后的函数。

wrapper函数使用了*args**kwargs来接受任意数量和类型的输入参数。在函数开始和结束时,它会分别打印输入参数和返回结果。

注意,在wrapper函数内部,我们使用了functools.wraps装饰器来确保被装饰后的函数的名称和文档字符串等属性与原函数一致,这样不会破坏原函数的结构。

下面是一个使用示例:

@log
def add(a, b):
    return a + b

@log
def multiply(a, b):
    return a * b

print(add(2, 3))
print(multiply(4, 5))

上面的代码中,我们定义了两个函数addmultiply并分别使用了@log装饰器来装饰它们。

调用add(2, 3)会打印如下日志信息:

Calling add with arguments: 2, 3
add returned: 5

调用multiply(4, 5)会打印如下日志信息:

Calling multiply with arguments: 4, 5
multiply returned: 20

通过这个装饰器,我们可以方便地记录函数的输入和输出日志,从而更好地了解函数的运行情况和调试程序。同时,由于装饰器的灵活性,我们可以轻松地在任何需要的函数上添加日志记录功能,而无需修改函数本身的代码。