Python 20个实用高效装饰器

一、性能优化类

  1. @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
  1. @memoize:缓存函数结果 避免重复计算,显著加速递归或高开销函数(如斐波那契数列)。
def memoize(func):
    cache = {}
    def wrapper(*args):
        if args not in cache:
            cache[args] = func(*args)
        return cache[args]
    return wrapper
  1. @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

二、调试与错误处理

  1. @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
  1. @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
  1. @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
  1. @deprecated:标记废弃函数 提示用户替换旧函数。
import warnings
def deprecated(func):
    def wrapper(*args, **kwargs):
        warnings.warn(f"{func.__name__} is deprecated", DeprecationWarning)
        return func(*args, **kwargs)
    return wrapper

三、数据验证与处理

  1. @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
  1. @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
  1. @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

四、安全与权限控制

  1. @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
  1. @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
  1. @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

五、其他实用装饰器

  1. @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
  1. @singleton:单例模式 确保类只有一个实例。
def singleton(cls):
    instances = {}
    def wrapper(*args, **kwargs):
        if cls not in instances:
            instances[cls] = cls(*args, **kwargs)
        return instances[cls]
    return wrapper
  1. @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
  1. @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
  1. @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
  1. @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

最佳实践总结

  1. 组合使用:如 @timer + @memoize 分析并优化性能

  2. 保留元信息:用 functools.wraps 保持函数名和文档字符串

from functools import wraps
def decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        # ...
  1. 参数化装饰器:通过闭包实现灵活配置(如 @retry(max_attempts=5))

  2. 避免副作用:确保装饰器不影响原函数逻辑(如错误处理中返回 None 需谨慎)

“无他,惟手熟尔”!有需要的用起来!关注「Nicholas与Pypi」获取更多Python实战!

更多推荐