Python 收益不起作用,但回报起作用

Python 收益不起作用,但回报起作用,python,irc,Python,Irc,我正在制作一个Python irc机器人。出于某种原因,join()方法中的yield语句使它完全跳过该方法,但是如果我用return替换它,它就可以正常工作。但是,每次不成功的连接尝试都需要产生一个错误 我有一个bot的join方法,如果由于某种原因连接失败,它将返回服务器错误命令代码响应。如果bot成功加入,则为“无” unsuccessful = bot.join(channels) 我将能够做到: if unsuccessful: for error in unsuccessf

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

我有一个bot的join方法,如果由于某种原因连接失败,它将返回服务器错误命令代码响应。如果bot成功加入,则为“无”

unsuccessful = bot.join(channels)
我将能够做到:

if unsuccessful:
    for error in unsuccessful:
        print(error)
join方法如下所示

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)
如果我将“屈服响应”切换为“返回响应”,它将运行该方法

get_响应方法如下所示

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


不过,我不确定发电机是否适合您。当您遇到第一个错误时,最好立即返回
响应
,或者如果您想查看所有通道,请将每个错误响应附加到错误列表中,并在完成后返回该列表。

您了解什么是
收益率
以及如何使用生成器吗
bot.join(频道)
返回一个生成器;你需要迭代它才能得到它产生的值。@BrenBarn我将编辑这个问题,以说明我将使用“unsuccessful”作为生成器,它以什么方式“不起作用”?它有什么作用?你是说它不会打印循环中的任何内容吗?它根本不会进入join()方法并运行下一个方法调用。没有异常或任何东西。在您开始迭代
不成功的
之前,它不会进入join方法。发电机就是这样工作的。好吧,如果我不能让它工作的话,我打算用后者。否则,我将毫无意义地遍历None。这就像回到Java或其他语言,必须返回一个数组。我很惊讶我在别处找不到这个。我认为生成器在迭代时会添加到变量中。现在这是有道理的了。MarkHildreth发布的链接是Python生成器最好的资源之一(如果不是最好的话!),比pydocs好得多!e-satis刚刚杀死了它:D