📚 简介
创建一个可以同时用于同步函数和异步函数的装饰器。
🚀 实现代码
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 | 等待异步操作 |
💡 使用场景
- ⏱️ 函数执行时间统计
- 📝 日志记录
- 🔐 权限验证
- 🔄 重试机制