このスレッドに落ちて、非常にシンプルで読みやすい答えが欠けていることに気づきました:
def is_empty(generator):
for item in generator:
return False
return True
アイテムを消費することを想定していない場合は、最初のアイテムをジェネレーターに再注入する必要があります。
def is_empty_no_side_effects(generator):
try:
item = next(generator)
def my_generator():
yield item
yield from generator
return my_generator(), False
except StopIteration:
return (_ for _ in []), True
例:
>>> g=(i for i in [])
>>> g,empty=is_empty_no_side_effects(g)
>>> empty
True
>>> g=(i for i in range(10))
>>> g,empty=is_empty_no_side_effects(g)
>>> empty
False
>>> list(g)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]