对空生成器做出反应的 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