python 中的协程与类

Bor*_*ury 2 python coroutine

我的问题是一个非常广泛的问题。既然可以使用对象,为什么还要使用协程呢?我可以轻松实现一个迭代器,该迭代器仅在 next() 下运行一次,之后您必须调用 o.send(x)。除了可以通过 OOP 实现状态持久性之外,协程还有其他作用吗?它们更轻吗?它只是语法糖吗?我实际上可以对生成器与迭代器提出同样的问题,但我想我已经读到生成器只是语法糖。

如果确实如此,为什么协程如此重要?我确信我错过了一些关于他们的事情,但我不知道是什么。

Aur*_*ílý 6

是的,从技术上讲,协程是语法糖,但不是普通的那种。yield任何协程都可以在不使用、等的情况下手动重写。send但是这种转换可能会很痛苦。考虑(改编自此处):

def print_name(prefix):
  print("Searching prefix: {}".format(prefix))
  while True:
    firstName = (yield)
    lastName = (yield)
    if prefix in firstName or prefix in lastName:
      print("{} {}".format(firstName, lastName))
Run Code Online (Sandbox Code Playgroud)

可以将其重写为:

class NamePrinter(object):
  def __init__(self, prefix):
    self.prefix = prefix
    self.gotFirstName = False

  def send(self, data):
    if not self.gotFirstName:
      self.firstName = data
      self.gotFirstName = True
    else:
      self.lastName = data
      if self.prefix in self.firstName or self.prefix in self.lastName:
        print(name)
      self.gotFirstName = False
Run Code Online (Sandbox Code Playgroud)

这有效。但即使有了这个微型示例,在不使用协程时我们也必须编写更多内容。在更复杂的有状态协程中,程序员必须手动跟踪当前状态、哪些变量在当前状态下有意义等。

Python 中的协程(类似地asyncawait现代 JavaScript 以及未来的 C++ 中)会自动将线性代码转换为具有良好控制输入、轻松错误处理等的状态机。