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

Python中的函数装饰器是什么?如何使用它们?

发布时间:2023-06-13 11:48:47

Python中的函数装饰器是一种特殊类型的函数,它们可以用于在不修改现有函数代码的情况下改变该函数的行为。这种技术通常被称为“元编程”。

函数装饰器可以用来在函数执行期间添加新功能,例如记录运行时间、验证输入参数或进行缓存结果。装饰器可以被用作装饰器函数,它们接受一个函数作为参数,然后返回一个新的包装函数。

装饰器可以方便地通过语法糖实现。使用@符号在函数定义之前应用装饰器。例如,下面代码中的函数log_function()可以用来记录函数执行时间和函数的参数:

import time

def log_function(func):
    def wrapper(*args, **kwargs):
        start = time.time()
        result = func(*args, **kwargs)
        end = time.time()
        print(f"Function {func.__name__} took {end-start} seconds")
        print(f"Inputs: {args}, {kwargs}")
        return result
    return wrapper

@log_function
def do_something(x, y, z=1):
    time.sleep(z)
    return x+y

print(do_something(1, 2, z=0.1))

在此示例中,我们定义了一个名为log_function()的装饰器函数。它接受一个函数作为参数,并返回一个新的函数wrapper(),它将函数func()的参数保留下来并记录它们。然后,它调用func()并返回结果,同时记录其执行时间。最后,我们将装饰器应用于函数do_something(),并调用该函数。

运行此示例时,我们会发现输出了函数的执行时间和传递给函数的输入参数:

Function do_something took 0.10786175727844238 seconds
Inputs: (1, 2), {'z': 0.1}
3

另一个常见的用例是在函数执行之前或之后进行某些操作。例如,下面的装饰器可以用于检查函数参数,以确保它们没有为空字符串。

def no_empty_strings(func):
    def wrapper(*args, **kwargs):
        if any([not arg for arg in args]) or any([not v for v in kwargs.values()]):
            raise ValueError("Argument cannot be empty string")
        return func(*args, **kwargs)
    return wrapper

@no_empty_strings
def test_function(a, b, c, d=''):
    return a+b+c+d

print(test_function('hello', '', 'world'))

在本例中,我们定义了一个名为no_empty_strings()的装饰器函数,它检查所有传递给函数的参数是否为空字符串。如果有任何参数为空字符串,则该函数引发ValueError异常。否则,它将调用原始函数并返回结果。最后,我们将该装饰器应用于函数test_function(),并试图传递一个包含空字符串的参数。当函数发现其中一个参数为空字符串时,它将引发异常:

ValueError: Argument cannot be empty string

总之,装饰器是Python中一种非常有用的元编程技术,可以用于修改函数行为或添加新的功能。通过简单的语法糖,Python程序员可以轻松地将装饰器应用于函数,从而轻松实现最小干扰的功能增强。