装饰产生的功能

yay*_*ayu 5 python yield generator decorator 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
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 6

调用时,生成器函数返回迭代器对象.如果你的装饰器本身也是一个生成器,你需要遍历包装结果:

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
Run Code Online (Sandbox Code Playgroud)

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

if flag:
    yield from gen
Run Code Online (Sandbox Code Playgroud)