【发布时间】:2014-03-28 13:03:33
【问题描述】:
这是一个奇怪的问题,所以我会解释一下:
我有一个像这样的生成器,它充当 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语句。我在将此类消费者重写为明确的sendall 方面取得了一些成功,即使我大部分时间都在发送None。不确定这是否对您有帮助,但这是一个想法。 -
@IfLoop 但是与服务器通信与与服务器通信是一回事。通信的方向已经清楚地表达为数据进出协程的方向。为什么要拆分?
-
因为 python 中的生成器没有不同的
send()和next(),所以send()只是带有参数的next()。
标签: python generator yield coroutine yield-keyword