Python 20个实用高效装饰器
·
Python 20个实用高效装饰器
一、性能优化类
- @timer**:统计函数执行时间 用于性能分析,快速定位代码瓶颈。
import time
def timer(func):
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(f"{func.__name__} 耗时: {end - start:.4f}s")
return result
return wrapper
- @memoize:缓存函数结果 避免重复计算,显著加速递归或高开销函数(如斐波那契数列)。
def memoize(func):
cache = {}
def wrapper(*args):
if args not in cache:
cache[args] = func(*args)
return cache[args]
return wrapper
- @lru_cache:LRU缓存优化 使用functools内置装饰器,自动管理缓存大小。
from functools import lru_cache
@lru_cache(maxsize=128)
def expensive_query(n):
# 数据库查询或复杂计算
4、@rate_limit:函数调用限流 限制函数在单位时间内的调用次数,防止API滥用。
import time
def rate_limit(calls_per_second):
min_interval = 1.0 / calls_per_second
def decorator(func):
last_called = 0
def wrapper(*args, **kwargs):
nonlocal last_called
elapsed = time.time() - last_called
if elapsed < min_interval:
time.sleep(min_interval - elapsed)
last_called = time.time()
return func(*args, **kwargs)
return wrapper
return decorator
二、调试与错误处理
- @debug:打印函数参数 调试时输出参数和返回值,快速定位问题。
def debug(func):
def wrapper(*args, **kwargs):
print(f"[DEBUG] {func.__name__} args: {args}, kwargs: {kwargs}")
result = func(*args, **kwargs)
print(f"[DEBUG] {func.__name__} returned: {result}")
return result
return wrapper
- @retry:异常自动重试 网络请求失败时自动重试,提升鲁棒性。
def retry(max_attempts=3, delay=1):
def decorator(func):
def wrapper(*args, **kwargs):
for attempt in range(max_attempts):
try:
return func(*args, **kwargs)
except Exception as e:
print(f"Attempt {attempt+1} failed: {e}")
time.sleep(delay)
raise Exception("Max retries exceeded")
return wrapper
return decorator
- @suppress_errors:静默处理异常 避免非关键错误中断主流程。
def suppress_errors(func):
def wrapper(*args, **kwargs):
try:
return func(*args, **kwargs)
except Exception as e:
print(f"Error suppressed: {e}")
return None
return wrapper
- @deprecated:标记废弃函数 提示用户替换旧函数。
import warnings
def deprecated(func):
def wrapper(*args, **kwargs):
warnings.warn(f"{func.__name__} is deprecated", DeprecationWarning)
return func(*args, **kwargs)
return wrapper
三、数据验证与处理
- @validate_input:输入参数校验 确保数据符合预期格式(如类型、范围)。
def validate_input(*validators):
def decorator(func):
def wrapper(*args, **kwargs):
for i, val in enumerate(args):
if not validators[i](val):
raise ValueError(f"Invalid argument: {val}")
return func(*args, **kwargs)
return wrapper
return decorator
- @validate_output:输出结果校验 验证函数返回值(如非空、数值范围)。
def validate_output(validator):
def decorator(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
if not validator(result):
raise ValueError("Output validation failed")
return result
return wrapper
return decorator
- @type_check:参数类型检查 强制类型约束,减少运行时错误。
def type_check(**types):
def decorator(func):
def wrapper(*args, **kwargs):
for k, v in kwargs.items():
if k in types and not isinstance(v, types[k]):
raise TypeError(f"{k} must be {types[k]}")
return func(*args, **kwargs)
return wrapper
return decorator
四、安全与权限控制
- @permission_required:权限校验 Web API中检查用户权限(如admin角色)。
def permission_required(permission):
def decorator(func):
def wrapper(user, *args, **kwargs):
if user.permission != permission:
raise PermissionError("Access denied")
return func(user, *args, **kwargs)
return wrapper
return decorator
- @require_login:登录状态检查 确保用户已认证。
def require_login(func):
def wrapper(user, *args, **kwargs):
if not user.is_authenticated:
raise Exception("User not logged in")
return func(user, *args, **kwargs)
return wrapper
- @rate_limit_api:API调用频率限制 防止DDoS攻击或滥用。
from redis import Redis
redis = Redis()
def rate_limit_api(key, limit=100, period=3600):
def decorator(func):
def wrapper(*args, **kwargs):
count = redis.get(key) or 0
if int(count) >= limit:
raise Exception("API rate limit exceeded")
redis.incr(key, 1)
redis.expire(key, period)
return func(*args, **kwargs)
return wrapper
return decorator
五、其他实用装饰器
- @log_results:结果日志记录 持久化保存函数输出。
def log_results(filename):
def decorator(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
with open(filename, "a") as f:
f.write(f"{func.__name__}: {result}\n")
return result
return wrapper
return decorator
- @singleton:单例模式 确保类只有一个实例。
def singleton(cls):
instances = {}
def wrapper(*args, **kwargs):
if cls not in instances:
instances[cls] = cls(*args, **kwargs)
return instances[cls]
return wrapper
- @threaded:函数线程化 将阻塞函数转为后台线程。
import threading
def threaded(func):
def wrapper(*args, **kwargs):
thread = threading.Thread(target=func, args=args, kwargs=kwargs)
thread.start()
return thread
return wrapper
- @lock_decorator:线程锁保护 防止多线程资源竞争。
from threading import Lock
def lock_decorator(lock=Lock()):
def decorator(func):
def wrapper(*args, **kwargs):
with lock:
return func(*args, **kwargs)
return wrapper
return decorator
- @visualize:自动可视化结果 数据科学中自动生成图表。
import matplotlib.pyplot as plt
def visualize(func):
def wrapper(*args, **kwargs):
result = func(*args, **kwargs)
plt.plot(result)
plt.title(func.__name__)
plt.show()
return result
return wrapper
- @configurable:动态参数注入 从配置文件加载参数。
import configparser
def configurable(section):
def decorator(func):
def wrapper(*args, **kwargs):
config = configparser.ConfigParser()
config.read("config.ini")
kwargs.update(config[section])
return func(*args, **kwargs)
return wrapper
return decorator
最佳实践总结
-
组合使用:如 @timer + @memoize 分析并优化性能
-
保留元信息:用 functools.wraps 保持函数名和文档字符串
from functools import wraps
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# ...
-
参数化装饰器:通过闭包实现灵活配置(如 @retry(max_attempts=5))
-
避免副作用:确保装饰器不影响原函数逻辑(如错误处理中返回 None 需谨慎)
“无他,惟手熟尔”!有需要的用起来!关注「Nicholas与Pypi」获取更多Python实战!
更多推荐


所有评论(0)