每次重复迭代时,例程返回None

时间:2020-04-03 10:47:45

标签: python-3.x yield coroutinescope

我有一段代码,如下所示:

#!/bin/python3

import math
import os
import random
import re
import sys
import logging


def consumer():
    while True:
        x = yield
        print(x)

def producer(n):
    for _ in range(n):
        x = int(input())
        yield x


def rooter():
    logging.info("Running the rooter")
    while True:
        value = (yield)
        yield math.sqrt(value)


def squarer():
    logging.info("Running the squarer")
    while True:
        value = (yield)
        print("from squarer: {}".format(value))
        yield value * value


def accumulator():
    logging.info("Running the accumulator.")
    running_total = 0
    while True:
        value = (yield)
        running_total += value
        yield running_total


def pipeline(prod, workers, cons):
    logging.info("workers: {}".format(workers))
    for num in prod:
        for i, w in enumerate(workers):
            num = w.send(num)
        cons.send(num)
    for worker in workers:
        worker.close()
    cons.close()

if __name__ == '__main__':
    order = input().strip()
    m = int(input())

    prod = producer(m)

    cons = consumer()
    next(cons)

    root = rooter()
    next(root)

    accumulate = accumulator()
    next(accumulate)

    square = squarer()
    next(square)

    pipeline(prod, eval(order), cons)

样本输入

[square, accumulate]
3  <- Number of inputs coming further

1  <- actual inputs
2
3

样本输出

*The output should be as below:*
1
5
14

但是来到 1013的平方和)实际上应为1412的平方和,3

因此,实际上缺少输入2(在输入行中排第二)。 进一步调试时,我发现每个替代迭代都是这种情况,而不仅仅是此处提供的输入。

我无法解读正在发生的事情。如果有帮助,协程squarer是在第二次迭代中返回None的例程。 我将不胜感激。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。

这是我们在pipeline函数中使用完联例程后对其进行了初始化,因此代码如下:我已在星号中标记了next(w)行以供参考。

#!/bin/python3

import math
import os
import random
import re
import sys
import logging


def consumer():
    while True:
        x = yield
        print(x)

def producer(n):
    for _ in range(n):
        x = int(input())
        yield x


def rooter():
    logging.info("Running the rooter")
    while True:
        value = (yield)
        yield math.sqrt(value)


def squarer():
    logging.info("Running the squarer")
    while True:
        value = (yield)
        print("from squarer: {}".format(value))
        yield value * value


def accumulator():
    logging.info("Running the accumulator.")
    running_total = 0
    while True:
        value = (yield)
        running_total += value
        yield running_total


def pipeline(prod, workers, cons):
    logging.info("workers: {}".format(workers))
    for num in prod:
        for i, w in enumerate(workers):
            num = w.send(num)
            **next(w)**
        cons.send(num)
    for worker in workers:
        worker.close()
    cons.close()

if __name__ == '__main__':
    order = input().strip()
    m = int(input())

    prod = producer(m)

    cons = consumer()
    next(cons)

    root = rooter()
    next(root)

    accumulate = accumulator()
    next(accumulate)

    square = squarer()
    next(square)

    pipeline(prod, eval(order), cons)

PEP specification中所述,它表示生成器函数的yield 通过正常的None通话恢复时,始终为next。因此,当明确地对yield进行操作时,在这种情况下,它将可以立即处理下一个输入。

相关问题