python中的复杂生成器

2024-10-02 10:20:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个长期运行的任务,必须由外部代码指导。但是外部代码需要一些关于这个任务的信息。我的例子是:

def longtask(self):
    yield self.get_step_length(1)
    for x in self.perform_step(1):
        ...
        yield x.id

    yield self.get_step_length(2)
    for x in self.perform_step(2):
        ...
        yield x.value

...
# call site
generator = self.longtask()
step1len = generator.Next()
step1pb = ProgressBar('Step 1', step1len)
# pull only step 1 items
for index, id in itertools.izip(xrange(0, step1len), generator):
    step1pb.update(index)
    ...do something with id

step2len = generator.Next()
step2pb = ProgressBar('Step 2', step1len)
# pull only step 1 items
for index, value in itertools.izip(xrange(0, step1len), generator):
    step2pb.update(index)
    ... do something other with value

在python中使用如此复杂的生成器协议是正确的,还是我需要重构这段代码?在


Tags: 代码inselfidforgetindexvalue
1条回答
网友
1楼 · 发布于 2024-10-02 10:20:11

我会将其重构为返回单独的生成器;您可以使用嵌套函数:

def longtask(self):
    def step_generator(step):
        for x in self.perform_step(step):
            ...
            yield x.id

    yield step_length_1, step_one_generator(1)
    yield step_length_2, step_one_generator(2)

generators = self.longtask()
for counter, (steplength, stepgen) in enumerate(generators):
    ProgressBar('Step %d' % counter, steplength)
    for index, value in enumerate(stepgen):
        # ....

现在您还可以使用enumerate()函数向项中添加数字;这比将xrange()和生成器压缩在一起要易读得多。在

相关问题 更多 >

    热门问题