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