这是一个奇怪的问题,所以我会解释一下:
我有一个像这样的生成器,它充当 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/