为变量分配(yield)

时间:2018-03-03 05:46:47

标签: python yield

首先,我想提一下我对Python并不是特别熟悉。我最近被迫熟悉一个代码样本,这样我的下巴半开,我无法“翻译”它。我看过的各种文件和文章都没有帮助:

以下是相关功能的缩短版本:

@coroutine
def processMessage(receiver):
    global userID
    #...
    while True:
        msg = (yield)
        try:
            #...
        except Exception as err:
            #...

我无法理解它的作用,因此无法“遍历”代码。我的问题是“这个功能有什么作用?”和“这个函数遵循什么序列?”

抛出我的线是msg = (yield)。我不知道它想要实现什么。 Intuition告诉我它只是在收到新消息时抓取它们,但是我无法理解为什么。如果有人知道,如果我提供了足够的信息,我真的很感激解释。

Try条款:

if msg['event'] == 'message' and 'text' in msg and msg['peer'] is not None:
    if msg['sender']['username'] == username:
        userID = msg['receiver']['peer_id']
        config.read(fullpath + '/cfg/' + str(userID) + '.cfg')
        if config.has_section(str(userID)):
            log('Config found')
            readConfig()
            log('Config loaded')
        else:
            log('Config not found')
            writeConfig()
            log('New config created')
    if 'username' in msg['sender']:
        parse_text(msg['text'], msg['sender']['username'], msg['id'])

P.S。 receiver是套接字接收器。

1 个答案:

答案 0 :(得分:5)

生成器中的语法variable = (yield some_value)执行以下操作:

  • 它会将some_value返回给调用它的代码(通过nextsend);
  • 下次调用时(通过.next.send(another_value)),它会将another_value分配给variable并继续执行。

例如,假设您有一个生成器函数:

>>> def f():
...     while True:
...         given = (yield)
...         print("you sent me:", given)
...

现在,我们来电话f。这让我们回到了发电机。

>>> g = f()

我们第一次使用生成器时我们无法发送数据

>>> next(g)

此时它刚刚评估了yield ...当我们现在调用.send时,它将从那一点继续,将我们发送给它的数据分配给给定的变量

>>> g.send("hello")
('you sent me:', 'hello')
>>> g.send("there")
('you sent me:', 'there')

在您的特定示例代码中,您有一个生成器:

  • 从外部收到要处理的消息......有些事情会调用.send(some_msg);
  • 它将处理该消息,然后回到外部呼叫者,然后再向其提供另一条消息。