Мне интересно, что лучше всего подходит для написания сопрограмм в Python 3. Я разрабатываю базовые методы, которые должны принимать некоторые данные (используя метод .send()), выполнять вычисления на этом входе, и затем выход выход.Coroutines in Python: Best Practices
Первый подход, который я нашел, по существу сделать следующее:
def coroutine(func):
data = yield
while 1:
data = yield func(data)
Это, кажется, работает, но строка в цикле прогибается мой ум. Кажется, что сначала дается функция, а затем принимает ввод и выполняет назначение после возобновление. Это совершенно неинтуитивно для меня.
Другой подход, который я смотрю на это:
def coroutine():
while 1:
data = yield
[ do stuff with data here ... ]
yield result
Этот код намного проще для меня, чтобы понять, и это также позволяет мне поставить код прямо в генератор вместо прохождения в функции. Но это раздражает. Каждый фактический вызов генератору (например, «gen.send (2)») должен сопровождаться «gen.send (None)», чтобы довести генератор до следующего выхода.
Мне кажется, что проблема здесь связана с ключевым словом «yield», используемым для двух разных вещей: оператора return и оператора ввода.
Если возможно, мне нужен подход, который позволяет мне вводить ввод, выполнять вычисления на этом входе, а затем давать выход без необходимости передавать функции и использовать однострочные линии, как в первом подходе, или отправлять посторонние значения как и во втором подходе. Как я могу это сделать?
Обратите внимание: на самом деле, я отправлю несколько значений. Поэтому проблемы с посторонними «g.send (None)» утверждениями ухудшаются.
Мне кажется, что * оба * ваших примеров связаны с передачей функции. Кроме того, вы можете больше объяснить, почему вы хотите использовать генераторы для этого вообще. Ваши примеры настолько просты, что они не иллюстрируют каких-либо причин использования генераторов вместо того, чтобы просто вызвать вызывающий вызов 'func' сам в цикле. Кроме того, если первый пример уже работает на вас, каков ваш фактический вопрос? – BrenBarn
@BrenBarn Я отредактировал вопрос, чтобы подчеркнуть, что второму подходу не нужна функция, переданная, и это то, что я хочу. Мой вопрос: как использовать функции генерации в качестве второго подхода без необходимости постоянно отправлять объекты «Нет», чтобы перейти к правильной инструкции yield. – NotNotLogical