如何创建一个装饰器来装饰生成器函数? [关闭]

Posted

技术标签:

【中文标题】如何创建一个装饰器来装饰生成器函数? [关闭]【英文标题】:How do I create a decorator that will decorate a generator function? [closed] 【发布时间】:2021-06-22 20:24:40 【问题描述】:

我需要创建一个装饰器函数来装饰一个生成器函数。生成器函数产生问题 # 以作为装饰添加。装饰器需要接受一个引用函数的参数。包装器需要返回一个格式化字符串,即提示“问题#:”,其中# 将是在生成器对象上调用 next 产生的数字。

我知道我的代码不正确,但我不知道如何修复它或从这里去哪里。任何帮助将不胜感激

这是我目前拥有的:

def decorator(func):

    """decorator that constructs and saves a generator object"""

    gen_object = func()

    @wraps(func)
    def wrapper(*args, **kwargs):
        """wrapper"""
        question = func(*args, **kwargs)
        input(f'Question question <movie character>: ')
        return wrapper

【问题讨论】:

我不太明白你在问什么。如果你用代码证明你的意思会有所帮助 包装的结果也应该是生成器,还是应该是普通函数?如果它是一个生成器,它是否应该从原始生成器产生包装/修改的结果,或者究竟是什么?如果它是一个函数,它是否应该从生成器中获取所有结果,然后......究竟要做什么?为什么在你的例子中有一个input 电话? 某种minimal reproducible example 会很有帮助。请添加一个。 【参考方案1】:

如果您有一个简单的生成器,它会产生如下问题:

def someF():
    yield from [
        'Name a color',
        'Name an animal', 
        'Name a country'

]

然后你可以用装饰器包装它,这样它会遍历生成器并添加你想要的细节。如果您产生 input() 的结果,您可以像任何其他生成器一样捕获输入:

from functools import wraps

def gen(f):
    @wraps(f)
    def inner(*args, **kwargs):
        g = f(*args, **kwargs)
        for num, question in enumerate(g):
            yield input(f'question #num: question: ')
    return inner
    
@gen
def someF():
    yield from [
        'Name a color', 
        'Name an animal', 
        'Name a country'
    ]

g = someF()
list(g)

使用它看起来像:

> question #0: Name a color: Blue
> question #1: Name an animal: Dog
> question #2: Name a country: Bolivia
['Blue', 'Dog', 'Bolivia']

【讨论】:

以上是关于如何创建一个装饰器来装饰生成器函数? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

4装饰器生成器迭代器

为啥 Python 中没有 @override 装饰器来帮助提高代码的可读性? [关闭]

装饰器生成器

python之装饰器生成器迭代器

如何使用@property 装饰器来限制列表中的值

装饰器生成器迭代器