глубокое копирование генератора в python

Я использую функцию генератора, скажем:

def foo(): i=0 while (i<10): i+=1 yield i 

Теперь я хотел бы, чтобы опция копировала генератор после любого количества итераций, так что новая копия сохранит внутреннее состояние (в примере будет такое же «i»), но теперь будет независимым от оригинала (т. Е. Итерации над копией не следует изменять оригинал).

Я пробовал использовать copy.deepcopy но я получаю ошибку:

  "TypeError: object.__new__(generator) is not safe, use generator.__new__()" 

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

  • Объяснение, необходимое для объяснения объектов хеширования
  • Использование Counter () в Python для построения гистограммы?
  • Ошибка возврата к фляге "Функция просмотра не возвращала ответ"
  • Как я могу закрепить файл журнала в Python?
  • Доступ к данным о кустах с использованием Python
  • fft полосовой фильтр в питоне
  • Проблемы с удаленными звуками робота NAO
  • Получить pid процесса, который вызвал некоторый сигнал
  • 2 Solutions collect form web for “глубокое копирование генератора в python”

    Есть три случая, о которых я могу думать:

    • Генератор не имеет побочных эффектов, и вы просто хотите, чтобы вы смогли пройти через результаты, которые вы уже захватили. Вы можете рассматривать генератор с кешированием вместо истинного генератора. Вы можете совместно использовать генератор кэша, и если какой-либо клиент подходит к тому элементу, который еще не был, он будет продвигаться вперед. Это похоже на метод tee (), но выполняет ли функция tee в самом генераторе / кеше, вместо того, чтобы требовать от клиента этого.

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

    • Генератор имеет побочные эффекты и историю, что означает, что состояние генератора в G (x) зависит от результатов G (x-1), и поэтому вы не можете просто передать x обратно в него, чтобы начать где угодно. В этом случае, я думаю, вам нужно быть более конкретным о том, что вы пытаетесь сделать, поскольку результат зависит не только от генератора, но и от состояния других данных. Вероятно, в этом случае есть лучший способ сделать это.

    Комментарий для itertools.tee был моим первым предположением. Из-за предупреждения о том, что вы не должны продвигать оригинальный генератор больше после использования tee, я могу написать что-то вроде этого, чтобы выкрутить копию:

     >>> from itertools import tee >>> >>> def foo(): ... i = 0 ... while i < 10: ... i += 1 ... yield i ... >>> >>> it = foo() >>> it.next() 1 >>> it, other = tee(it) >>> it.next() 2 >>> other.next() 2 
    Interesting Posts

    Код Python для Bluetooth вызывает ошибку после того, как мне пришлось перезагрузить адаптер

    Грамматическая проверка для области текста html

    Почему существует ActivePython?

    Отсутствующие строки при записи файла с многопроцессорной блокировкой Python

    Консоль Ipython в Spyder застряла на «подключении к ядру»

    конвертировать значения RGB в эквивалентные значения HSV с использованием python

    Как заставить SMTPHandler не блокировать

    Внедрение пользовательского строкового метода

    Pyldap (использовать Django Auth LDAP) для установки в виртуальной среде python3

    cProfile сохранение данных в файл вызывает перебои символов

    Google App Engine: как писать большие файлы в Google Cloud Storage

    Вычисление числа конкретных последовательных равных значений в векторном виде в пандах

    Определите, находится ли каталог под контролем git

    Извлечение части изображения, которое соответствует маске в OpenCV

    Boost.python автоматически преобразует параметр

    Python - лучший язык программирования в мире.