Python 生成器发送 : don't yield a new value after a send

标签 python generator yield coroutine yield-keyword

这是一个奇怪的问题,所以我会解释一下:

我有一个像这样的生成器,它充当 IRC 服务器的生成器前端:

def irc_iter(): # not the real code, simplified
    msgs = get_msgs()
    for msg in msgs:
        if is_ping(msg):
            pong()
        else:
            to_send = yield msg
            for s in to_send:
                send(s)

从理论上讲,这应该允许我做一些很酷的事情,比如:

server = connect()
for line in server:
       if should_respond(line):
           server.send('WOW SUCH MESSAGE')

但是,有一个障碍:generator.send 也会产生下一个值。这意味着 server.send 也给我下一条消息......我更愿意像处理所有其他消息一样处理它,生成为 line

我知道我可以用一种丑陋的方式解决这个问题,即在收到发送后只产生一个垃圾值,但我试图让我的代码保持优雅,而事实恰恰相反。有没有办法告诉生成器我还不需要新值?

谢谢。

最佳答案

我也刚刚遇到这个问题,也没有发现比虚拟 yield 更好的东西......

因此在您的生成器代码中:

        # Input
        input_value = yield
        if input_value is None:
            # Handle situation if someone used your generator in a wrong way
            sys.exit(-1)
        yield "DUMMY YIELD JUST STOP HERE!!!"

在客户端代码中:

while True:
    values = next(my_generator)
    ...
    if values == 'INPUT_NEEDED':
        # At this point you realize it's input time
        next(my_generator) # Rewind to the input point
        my_generator.send(12345) # Returns "DUMMY YIELD JUST STOP HERE!!!"
        continue
    # Continue the main loop

关于Python 生成器发送 : don't yield a new value after a send,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22028903/

相关文章:

python - 检查组是否有 NaN 值

python - 使用 numpy 进行快速蒙特卡洛模拟?

python - 与实例相关的静态方法中的产量?

python函数产生元组,只需要一个元素

python - 使用 requests_html 时无法按预期提取结果

python - 检查套接字是否在python中使用

python - 为什么这个 python 生成器函数只能正确运行一次?

javascript - 如何正确设置Interval Generator?

python - 如何包装或嵌入生成器?

python - 用可迭代的东西替换函数