是否可行,如果可行,建议使用什么方法来装饰产生值的函数?
例如,考虑一下我编的这个假想的例子
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/