如何解决对空生成器做出反应的Pythonic方法?
我想为生成器编写一个包装器,以检查生成器是否产生任何东西,并且(例如)生成异常(如果没有)。
我可以写:
def my_wrapper(input):
if input is None:
return
found = False
for elem in my_yielding_function(input):
found = True
yield elem
if not found:
raise MyException("Empty Generator")
还有更多的Python方式可以做到这一点吗?
有一个非常similar question的地方,但是已经有10多年的历史了-也许情况已经改变了?
上下文:
很难解释-我正在使用给定的API函数,该函数可能不会产生任何结果,但在这种情况下, my 函数与空输入有所区别。
解决方法
除了避免了无用的for循环之外,还消除了标志的需要。您也可以将其用作装饰器,以使转发调用参数并仍然可重用
def check_if_empty_first(gen):
it = gen() # This is optional,depends if you want to make it reusable,and it you want to call with check_if_empty_first(gen) or check_if_empty_first(gen())
try:
yield next(it)
except StopIteration as e:
raise MyException("Empty Generator") from e
yield from it
装饰器版本:
from functools import wraps
def check_if_empty_first(gen):
@wraps(gen)
def inner(*args,**kwargs
it = gen(*args,**kwargs)
try:
yield next(it)
except StopIteration as e:
raise MyException("Empty Generator") from e
yield from it
return inner
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。