9

ちょっと変な質問なので、説明します。

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

送信を受信した後にジャンク値を生成するだけで、これを醜い方法で修正できることはわかっていますが、コードをエレガントに保とうとしていますが、それは逆です。まだ新しい値が必要ないことをジェネレーターに伝える方法はありますか?

ありがとう。

4

2 に答える 2

1

問題は、反復ごとにジェネレーターを 2 回呼び出すことから発生しているように見え.send(None)ます.send(response)

for ループが .next() の代わりに .send() を反復処理できる場合は簡単な修正ですが、それを機能させる方法に慣れていません (pep342 のオプションの拡張された continue ステートメント?) でラップせずに別のジェネレーター (おそらくキューを使用して、.next() 呼び出しで値を .send() にプッシュします)。ただし、最も簡単な解決策はおそらく次のとおりです。

server = connect()
response = None 
try:
    while True:
        line = server.send(response)
        response = None
        if should_respond(line):
            response ='WOW SUCH MESSAGE'
except StopIteration:
    pass
于 2014-02-26T01:17:39.440 に答える