python装饰器 - 异步同步通用装饰器

📚 简介

创建一个可以同时用于同步函数和异步函数的装饰器。

🚀 实现代码

import asyncio
import time
import functools


def exec_time(func):
    """
    统计函数耗费时间的装饰器
    同时支持同步函数和异步函数
    """
    @functools.wraps(func)
    async def async_warp(*args, **kwargs):
        st = time.time()
        result = await func(*args, **kwargs)
        print(f"{func.__name__} spend {time.time() - st}")
        return result

    @functools.wraps(func)
    def sync_warp(*args, **kwargs):
        st = time.time()
        result = func(*args, **kwargs)
        print(f"{func.__name__} spend {time.time() - st}")
        return result
    
    # 判断函数是否为异步函数
    if asyncio.iscoroutinefunction(func):
        return async_warp
    else:
        return sync_warp


@exec_time
async def async_func():
    """异步函数"""
    await asyncio.sleep(1)
    print("async sleep done")


@exec_time
def sync_func():
    """同步函数"""
    time.sleep(1)
    print("sync sleep done")


if __name__ == "__main__":
    # 调用异步函数
    asyncio.run(async_func())
    # 调用同步函数
    sync_func()

📦 关键点

组件说明
functools.wraps保留原函数的元信息
asyncio.iscoroutinefunction判断是否为异步函数
async def异步函数定义
await等待异步操作

💡 使用场景

  • ⏱️ 函数执行时间统计
  • 📝 日志记录
  • 🔐 权限验证
  • 🔄 重试机制

作者:spike

分类: Python

创作时间:2026-02-23

更新时间:2026-02-23