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)
调用时,生成器函数返回迭代器对象.如果你的装饰器本身也是一个生成器,你需要遍历包装结果:
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)