python - yield 不起作用,但 return 起作用

标签 python irc

<分区>

我正在制作一个 Python irc 机器人。出于某种原因,我的 join() 方法中的 yield 语句使其完全跳过该方法,但如果我用 return 替换它,它就可以正常工作。但是,我需要在每次不成功的加入尝试时产生一个错误。

我有一个机器人的加入方法,如果由于某种原因加入不成功,它会返回服务器错误命令代码响应。如果机器人加入成功,则为 None。

unsuccessful = bot.join(channels)

我能做到:

if unsuccessful:
    for error in unsuccessful:
        print(error)

连接方法如下所示

def join(self, channels):
    chan_errors = range(471, 480)  # See RFC for commands 471-479

    if isinstance(channels, str):
        channels = [channels,]

    for channel in channels:
        self.send('JOIN %s' % channel)
        for response in self.get_response('JOIN', chan_errors):  # Verify
            if response.command in chan_errors:
                channels.remove(channel)
                yield response
    self.channels.append(channels)

如果我将“ yield 响应”切换为“返回响应”,它就会运行该方法。

get_response 方法看起来像

def get_response(self, commands, terminators=None):
    for msg in self.msg_gen():
        self.handle(msg)
        if msg.command in commands:
            if terminators is None:
                return msg
            yield msg
        if msg.command in terminators:
            return msg

它从消息生成器接收消息。命令是调用者正在寻找的服务器命令,当找到终止符时,终止符会从生成器中退出。这有点像协程。

有人知道这里发生了什么吗?

最佳答案

通过在 join 方法中放置一个 yield 语句,您就可以将它变成一个生成器。调用生成器方法只是创建一个生成器函数;您需要遍历它以获取数据。但是,由于每次遇到 yield 语句时生成器内部的执行都会停止,如果您希望它完全运行,您需要耗尽它的所有内容。

这样你的代码就会一直运行:

join_gen = bot.join(channels)
for error_msg in join_gen:
    print error_msg

Generators in the Python 2 docs

不过,我不确定生成器是否适合您。当您遇到第一个错误时,您可能会更好地返回 response ,或者如果您想通过所有 channel ,将每个错误响应附加到错误列表并在完成后返回该列表.

关于python - yield 不起作用,但 return 起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19413538/

相关文章:

python - 打印函数反斜杠消失Python 3

python - 如何以 “fire and forget” 异步运行函数?

Python返回十六进制地址而不是对象

python - Twisted IRC Bot 线程

ssh - 如何通过 SSH 运行 PHP 脚本并在我退出后保持运行

python - 如何在计划任务的情况下从 celery 获取任务 ID (beat)

python - 从轮廓内动态计算颜色阈值

java - 最好的开源irc聊天小程序

node.js - 如何在我的 IRC 机器人上实现反垃圾邮件技术?

python - 使用 oyoyo 构建的 Python IRC 机器人中的命令