为变量分配(yield)

问题描述 投票:3回答:1

首先,我想提一下我对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'])

附: receiver是一个插座接收器。

python yield
1个回答
4
投票

生成器中的语法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);
  • 它将处理该消息,然后回到外部调用者,然后将向其提供另一条消息。
© www.soinside.com 2019 - 2024. All rights reserved.