我有一些用例,在这些用例中,我需要运行生成器函数而不关心生成的项。
我不能使它们成为非泛型函数,因为在其他用例中,我肯定需要生成的值。
我目前正在使用一个自制的小功能来排气发电机。
def exhaust(generator):
for _ in generator:
pass
我想知道,是否有一种更简单的方法来做到这一点,而这正是我所缺少的?
编辑
遵循用例:
def create_tables(fail_silently=True):
"""Create the respective tables."""
for model in MODELS:
try:
model.create_table(fail_silently=fail_silently)
except Exception:
yield (False, model)
else:
yield (True, model)
在某些情况下,我关心错误和成功的价值观…
for success, table in create_tables():
if success:
print('Creation of table {} succeeded.'.format(table))
else:
print('Creation of table {} failed.'.format(table), file=stderr)
……在有些情况下,我只想“盲目地”运行函数:
exhaust(create_tables())
最佳答案
为此设置for循环可能会相对昂贵,要记住python中的for循环基本上是简单赋值语句的连续执行;您将执行n(生成器中的项数)赋值,但之后会丢弃赋值目标。
相反,您可以将生成器馈送到零长度deque
;以C速度消耗,不占用与list
和其他实现迭代器/生成器的可调用的内存。
from collections import deque
def exhaust(generator):
deque(generator, maxlen=0)
取自
consume
itertools配方。关于python - 运行发生器功能而无需关心项目的更简单方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47456631/