сопрограммы против классов в Python - PullRequest
0 голосов
/ 22 января 2019

Мой вопрос очень широкий.Зачем использовать сопрограммы, когда можно использовать объекты?Я мог бы легко реализовать итератор, который работает только один раз под next (), и после этого вы должны вызвать o.send (x).Есть ли в сопрограммах нечто большее, чем упорство состояния, которое может быть достигнуто с помощью ООП?Они легче?Это просто синтаксический сахар?Я мог бы фактически спросить то же самое о генераторах и итераторах, но там я думаю, что я читал, что генераторы - это просто синтаксический сахар.

Если это действительно так, почему сопрограммы так важны?Я уверен, что что-то упускаю из них, но не могу понять, что.

Ответы [ 2 ]

0 голосов
/ 22 января 2019

Да, технически сопрограммы являются синтаксическим сахаром, но не тривиальным видом. Любая сопрограмма потенциально может быть переписана вручную без использования 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))

Вы могли бы переписать это как:

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

Это работает. Но даже с этим микро-примером мы должны писать намного больше, когда не используем сопрограммы. В более сложных сопрограммах с состоянием программист должен вручную отслеживать текущее состояние, какие переменные имеют значение в текущем состоянии и т. Д.

Сопрограммы в Python (и аналогично async / await в современном JavaScript, а также в будущем C ++) автоматически преобразуют линейный код в конечный автомат с хорошо контролируемыми входными данными, простой обработкой ошибок и т. Д. И т. Д.

0 голосов
/ 22 января 2019

Сопрограммы - это способ добавить асинхронные действия в ваше приложение. Объекты - это просто вещи в вашем приложении, которые содержат информацию или выполняют работу. Таким образом, оба используются вместе для создания асинхронного приложения.

https://www.geeksforgeeks.org/coroutine-in-python/

...