python - 装饰一个产生的函数

标签 python generator decorator yield python-decorators

是否可行,如果可行,建议使用什么方法来装饰产生值的函数?

例如,考虑一下我编的这个假想的例子

def foobar_creator(func):
    def wrapped(**kwargs):
       res = func(**kwargs)
       flag = True
       for k,v in kwargs:
           if res % v == 0:
               flag = False
               yield k
       if flag: 
            yield res
     return wrapped

@foobar_creator
def generic_yielder(**kwargs):
     for i in xrange(sys.maxint):
           yield i

for i in generic_yielder(foo=3, bar=5, foobar=15):
      print i

最佳答案

生成器函数在被调用时返回一个迭代器对象。如果您的装饰器本身也是一个生成器,您将需要循环包装的结果:

def foobar_creator(func):
    def wrapped(**kwargs):
        gen = func(**kwargs)
        flag = True
        for k, v in kwargs:
            if res % v == 0:
                flag = False
                yield k
        if flag:
            for res in gen:
                yield res
    return wrapped

如果您使用的是 Python 3.3 或更高版本,您可以使用 delegation 来手动控制包装生成器,方法是使用 yield from:

if flag:
    yield from gen

关于python - 装饰一个产生的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27087825/

相关文章:

用于捕获 Url 中日期的 Python 正则表达式

python - Python 中生成器的使用

产生更多结果的 Python 生成器需要更多时间来创建

javascript - 在生成器函数中使用 yield 时,Typescript 不会推断 promise 类型

python - 是否可以使用装饰器在 Python 中进行 "extended"时间监控?

javascript - 类索引装饰器和列装饰器有什么区别?

python - 使用类装饰器,如何在不重新定义类的情况下重写方法?

javascript - Flask/jinja 发送数组到 javascript

python - 继承 - 使用类方法创建类的新实例的正确方法

python - 尝试在需要它的 python 脚本中定义 DJANGO_SETTINGS_MODULE 时出现错误