我正在尝试制作一个装饰器来包装协程或函数。
我尝试的第一件事是包装器中的简单重复代码:
def duration(func):
@functools.wraps(func)
def wrapper(*args, **kwargs):
start_ts = time.time()
result = func(*args, **kwargs)
dur = time.time() - start_ts
print('{} took {:.2} seconds'.format(func.__name__, dur))
return result
@functools.wraps(func)
async def async_wrapper(*args, **kwargs):
start_ts = time.time()
result = await func(*args, **kwargs)
dur = time.time() - start_ts
print('{} took {:.2} seconds'.format(func.__name__, dur))
return result
if asyncio.iscoroutinefunction(func):
return async_wrapper
else:
return wrapper
Run Code Online (Sandbox Code Playgroud)
这有效,但我想避免代码重复,因为这并不比编写两个单独的装饰器好多少。
然后我尝试使用类制作一个装饰器:
class SyncAsyncDuration:
def __init__(self):
self.start_ts = None
def __call__(self, func):
@functools.wraps(func)
def sync_wrapper(*args, **kwargs):
self.setup(func, args, kwargs)
result = …Run Code Online (Sandbox Code Playgroud)