对空生成器做出反应的 Pythonic 方式?
Pythonic way to react on empty generators?
我想为生成器编写一个包装器,用于检查生成器是否产生任何结果,如果没有产生(例如)则引发异常。
我可以写:
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")
是否有更 pythonic 的方法来做到这一点?
有一个非常 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
我想为生成器编写一个包装器,用于检查生成器是否产生任何结果,如果没有产生(例如)则引发异常。
我可以写:
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")
是否有更 pythonic 的方法来做到这一点?
有一个非常 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