始终处理的生成器函数,但并不总是产生

问题描述 投票:2回答:1

我有一个生成器函数,它做两件事:

  1. 读取文件并根据输出写入另一个文件。
  2. 产生刚刚写入的记录的关键值。

问题是我并不总是想要做点(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”中的,所以它并不是真正可以从那里拉出并单独完成的东西。

python-3.x generator python-3.7
1个回答
1
投票

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))

© www.soinside.com 2019 - 2024. All rights reserved.