我有一个生成器函数,它做两件事:
问题是我并不总是想要做点(2),当我以这样的方式调用它时我只想将行写入新文件时,它就不会被调用(即打印语句)因为第一行甚至没有得到输出。当被调用时,尝试/除了这里没有任何东西。
我已经设置了一个简化的测试用例,只是为了验证这是“正常”,它会重现相同的结果。
test.朋友
from test2 import run_generator
if __name__ == '__main__':
print('*** Starting as generator ***')
for num in run_generator(max=10, generate=True):
print(f'Calling : {num}')
print('*** Starting without yielding ***')
run_generator(max=10, generate=False)
print('*** Finished ***')
test2.朋友
def run_generator(max, generate):
print('*** In the generator function ***')
sum = 1
for i in range(max):
print(f'Generator: {i}')
sum += i
if generate:
yield i
print(f'End of generator, sum={sum}')
这给了我输出:
$ python3 test.py
*** Starting as generator ***
*** In the generator function ***
Generator: 0
Calling : 0
Generator: 1
Calling : 1
Generator: 2
Calling : 2
Generator: 3
Calling : 3
Generator: 4
Calling : 4
Generator: 5
Calling : 5
Generator: 6
Calling : 6
Generator: 7
Calling : 7
Generator: 8
Calling : 8
Generator: 9
Calling : 9
End of generator, sum=46
*** Starting without yielding ***
*** Finished ***
在测试示例中,我希望生成器函数在调用时仍然打印值,但告知不要屈服。 (在我的实例中,我仍然希望它对另一个文件执行f.write(),在该文件下,所有内容都是嵌套的,因为它是一个with open(file, 'w') as f:
语句。
我要它做一些蠢事吗?替代方案似乎是两个几乎完全相同的定义,这违反了DRY原则。因为在我的主要例子中,yield是嵌套在“with open”中的,所以它并不是真正可以从那里拉出并单独完成的东西。
it simply doesn't get called
- 这是因为你没有打电话给它。要解决此问题,请像任何其他生成器一样调用它。例如,就像你在第一种情况下所做的那样:for num in run_generator(max=10, generate=False): pass
。
我想,另一种方法是在next(run_generator(max=10, generate=False))
中使用try/except
语法,因为从未到达yield
所以你会得到StopIteration
错误。
或者类似result = list(run_generator(5, True/False))
。