Используйте send для генератора с itertools.tee

Я пытаюсь разделить генератор с send и itertools.tee. Хотя это работает для генератора без sendэтот пример выдает следующую ошибку:

AttributeError: у объекта 'itertools._tee' нет атрибута 'send'

from itertools import tee


def i():
    for j in range(10):
        yield j
        x = yield


k = i()
k.send(None)
next(k)

l1, l2 = tee(k)
next(l1)
l1.send(None)

Есть ли обходной путь или другие методы для разделения генератора. (Составлять список или не использовать генератор здесь не вариант)

2 ответа

Решение

Есть ли обходной путь или другие методы для разделения генератора.

Обычные (односторонние) генераторы легко работают с itertools.tee() или с чистым эквивалентом Python.

Тем не менее, двусторонние генераторы (где вы вводите данные с g.send(x) и получить его с x = yield y) не разделяются.

Причина в том, что тройные разделения по существу буферизуют ранее сообщенные результаты для повторного использования на каждом из разделений. Но двусторонний итератор не может повторно использовать предыдущие результаты, потому что он отправляет новые значения, которые могут повлиять на будущие вызовы.

Соответственно, вся концепция разделения потока перестает иметь смысл, когда вы можете отправить данные обратно из любого из разделенных потоков, каждый из которых может продвигаться в разные места.

Ваш код для i() сначала даешь, потом принимаешь x потом. Это означает, что вам нужно позвонить next() будет первый send(),

Другие вопросы по тегам