Python中的函数装饰器是什么?如何使用它们?
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程序员可以轻松地将装饰器应用于函数,从而轻松实现最小干扰的功能增强。
