用Python装饰生成器:在两个结果之间调用一些方法

2024-04-29 13:42:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现了一些关于在Python here中使用yield from装饰生成器函数的非常有用的信息。例如:

def mydec(func):
    def wrapper(*args, **kwargs):
        print(f'Getting values from "{func.__name__}"...')
        x = yield from func(*args, **kwargs)
        print(f'Got value {x}')
        return x
    return wrapper

@mydec
def mygen(n):
    for i in range(n):
        yield i

但是,这似乎只允许在生成器生命周期的开始和结束时添加修饰行为:

^{pr2}$

不过,我对每次生成器生成时使用decorator来实现一些行为很感兴趣。但是,decorator不应该修改从生成器获取的值。例如,我希望输出:

>>> foo = mygen(3)
>>> x = next(foo)
Getting values from "mygen"...
Got value 0
>>> x
0
>>> x = next(foo)
Got value 1
>>> x
1
>>> x = next(foo)
Got value 2
>>> x
2

因此,对print的调用在每次生成时都会发生,但是生成的值保持不变。在

这可能吗?在


Tags: fromfoovaluedefargswrapperkwargsnext
1条回答
网友
1楼 · 发布于 2024-04-29 13:42:05

yield from用于协同程序。你不是在做郊游。只需迭代生成器:

def mydec(func):
    def wrapper(*args, **kwargs):
        print(f'Getting values from "{func.__name__}"...')
        gen = func(*args, **kwargs)
        for value in gen:
            print(f'got value {value}')
            yield value
    return wrapper

相关问题 更多 >