10个常用的Python装饰器函数:如何优化你的代码
装饰器是Python中一种有用的编程工具,它可以用于在不修改原始代码的情况下扩展或修改函数。在这篇文章中,我将介绍10个常用的Python装饰器函数,并说明如何使用它们来优化你的代码。
1. 计时器装饰器:这个装饰器可以用来计算函数的执行时间。你可以将它应用到任何函数上,并在函数执行完毕后打印出执行时间。
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"函数 {func.__name__} 的执行时间为: {end_time-start_time}秒")
return result
return wrapper
@timer
def my_function():
# 函数代码
2. 缓存装饰器:这个装饰器可以用来缓存函数的计算结果,以避免重复计算。当函数以相同的参数被多次调用时,装饰器将直接返回缓存的结果。
def memoize(func):
cache = {}
def wrapper(*args):
if args in cache:
return cache[args]
result = func(*args)
cache[args] = result
return result
return wrapper
@memoize
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
3. 类型检查装饰器:这个装饰器可以用来检查函数的参数类型是否与预期一致。如果传入的参数类型不正确,装饰器将抛出一个TypeError。
def type_check(func):
def wrapper(*args, **kwargs):
for i, arg in enumerate(args):
if not isinstance(arg, int):
raise TypeError(f"参数 {i} 的类型不正确")
for key, value in kwargs.items():
if not isinstance(value, int):
raise TypeError(f"参数 {key} 的类型不正确")
return func(*args, **kwargs)
return wrapper
@type_check
def add(a, b):
return a + b
4. 日志记录装饰器:这个装饰器可以用来记录函数的日志。你可以将它应用到任何函数上,并在函数执行时将相关信息写入日志文件中。
import logging
def logger(func):
logging.basicConfig(filename='log.txt', level=logging.INFO)
def wrapper(*args, **kwargs):
logging.info(f"函数 {func.__name__} 被调用了")
return func(*args, **kwargs)
return wrapper
@logger
def my_function():
# 函数代码
5. 授权验证装饰器:这个装饰器可以用来验证用户的授权信息。你可以将它应用到任何需要授权访问的函数上,以确保只有授权用户才能执行该函数。
def authorized(func):
def wrapper(*args, **kwargs):
if not is_authorized():
raise PermissionError("用户没有授权")
return func(*args, **kwargs)
return wrapper
@authorized
def my_function():
# 函数代码
6. 重试装饰器:这个装饰器可以用来自动重试函数的执行,以应对可能出现的失败情况。你可以指定重试的次数和延迟时间。
import time
def retry(func):
def wrapper(*args, **kwargs):
max_retries = 3
delay = 1
for i in range(max_retries):
try:
return func(*args, **kwargs)
except Exception as e:
print(f"函数执行出错,正在重试 ({i+1}/{max_retries})")
time.sleep(delay)
print("函数执行失败")
return wrapper
@retry
def my_function():
# 函数代码
7. 输入验证装饰器:这个装饰器可以用来验证函数的输入参数是否符合特定的规则。如果参数不符合规则,装饰器将抛出一个ValueError。
def validate(func):
def wrapper(*args, **kwargs):
if not is_valid(*args, **kwargs):
raise ValueError("参数不符合规则")
return func(*args, **kwargs)
return wrapper
@validate
def my_function():
# 函数代码
8. 参数转换装饰器:这个装饰器可以用来将函数的输入参数转换成不同的类型。你可以根据需求将其应用到指定的参数,以确保函数能正常工作。
def convert_args(*types):
def decorator(func):
def wrapper(*args, **kwargs):
converted_args = []
for i, arg in enumerate(args):
converted_args.append(types[i](arg))
converted_kwargs = {}
for key, value in kwargs.items():
converted_kwargs[key] = types[len(args) + list(kwargs.keys()).index(key)](value)
return func(*converted_args, **converted_kwargs)
return wrapper
return decorator
@convert_args(str, int)
def my_function(name, age):
# 函数代码
9. 缓存带参数的装饰器:这个装饰器可以用来缓存带参数的函数的计算结果。不同于之前的缓存装饰器,这个装饰器根据参数来缓存不同的结果。
def cache_with_args(cache_size):
def decorator(func):
cache = {}
def wrapper(*args):
if args in cache:
return cache[args]
if len(cache) >= cache_size:
cache.popitem()
result = func(*args)
cache[args] = result
return result
return wrapper
return decorator
@cache_with_args(cache_size=10)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
10. 记录函数执行次数装饰器:这个装饰器可以用来记录函数被调用的次数。你可以将它应用到任何函数上,并在函数被调用时将调用次数打印出来。
def count_calls(func):
count = 0
def wrapper(*args, **kwargs):
nonlocal count
count += 1
print(f"函数 {func.__name__} 被调用了 {count} 次")
return func(*args, **kwargs)
return wrapper
@count_calls
def my_function():
# 函数代码
以上是10个常用的Python装饰器函数,它们可以帮助你优化你的代码,提高代码的可维护性和可扩展性。通过合理运用装饰器,你可以轻松地实现一些常见的编程需求,从而使你的代码更加高效和健壮。
