异步函数和异步生成器的装饰器

时间:2021-07-31 18:52:24

标签: python python-decorators

我想编写一个可以同时使用生成器和等待函数的装饰器。像这样:

def deco(function):
    async def wrapper(*args, **kwargs):
        try:
            print('\tTEST: Without errors!')

            if inspect.isasyncgenfunction(function):
                async def gen():
                    async for i in function(*args, **kwargs):
                        yield i
                return gen()
            else:
                return await function(*args, **kwargs)

        except (
            ZeroDivisionError
        ) as e:
            print('\tTEST: Handle error!')

    return wrapper

但我不知道如何在同一个函数中使用 yield 和 return。 为此,我创建了 gen 函数,以便异步生成器返回值不会出错。

@deco
async def generator_functional(messages, flag="Default"):
    for message in messages:
        if message == "3":
            raise ZeroDivisionError
        yield f'processed: {message} | {flag} | '
    return

在代码中我需要等待一个生成器

    async for item in await generator_functional(data):
        print(item)

但我需要像这样使用它

    async for item in generator_functional(data):
        print(item)

使用可等待函数,代码运行良好。

0 个答案:

没有答案