小编Ana*_*sul的帖子

如何创建一个可以包装协程或函数的 Python 装饰器?

我正在尝试制作一个装饰器来包装协程或函数。

我尝试的第一件事是包装器中的简单重复代码:

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)

decorator python-asyncio

17
推荐指数
3
解决办法
6162
查看次数

标签 统计

decorator ×1

python-asyncio ×1