New submission from Ram Rachum <cool...@cool-rr.com>: Please allow to deepcopy and to pickle paused generators, including all their state.
This is implemented in Pypy: Python 2.5.2 (335e875cb0fe, Dec 28 2010, 20:31:56) [PyPy 1.4.1] on win32 Type "copyright", "credits" or "license()" for more information. DreamPie 1.1.1 >>> import pickle, copy >>> def next(thing): # For compatibility ... return thing.next() >>> def g(): ... for i in range(4): ... yield i >>> list(g()) [0, 1, 2, 3] >>> live_generator = g() >>> next(live_generator) 0 >>> next(live_generator) 1 Now `live_generator` holds a generator which is in the middle of its operation. It went through 0 and 1, and it still has 2 and 3 to yield. We deepcopy it: >>> live_generator_deepcopy = copy.deepcopy(live_generator) The deepcopied generator assumes the same state of the original one. Let's exhaust it: >>> list(live_generator_deepcopy) [2, 3] >>> list(live_generator_deepcopy) [] Pypy also lets us pickle and unpickle the live generator: >>> live_generator_pickled = pickle.dumps(live_generator) >>> live_generator_unpickled = pickle.loads(live_generator_pickled) >>> list(live_generator_unpickled) [2, 3] >>> list(live_generator_unpickled) [] And the original live generator was unchanged by all these operations: >>> list(live_generator) [2, 3] >>> list(live_generator) [] All the above was demonstrated in Pypy. In Python 3.2, trying to pickle a live generator raises this exception: >>> pickle.dumps(live_generator) Traceback (most recent call last): File "<stdin>", line 1, in <module> _pickle.PicklingError: Can't pickle <class 'generator'>: attribute lookup builtins.generator failed And trying to deepcopy one raises this exception: >>> copy.deepcopy(live_generator) Traceback (most recent call last): File "<stdin>", line 1, in <module> File "c:\Python32\lib\copy.py", line 174, in deepcopy y = _reconstruct(x, rv, 1, memo) File "c:\Python32\lib\copy.py", line 285, in _reconstruct y = callable(*args) File "c:\Python32\lib\copyreg.py", line 88, in __newobj__ return cls.__new__(cls, *args) TypeError: object.__new__(generator) is not safe, use generator.__new__() It would be nice if Python 3.2 could pickle and deepcopy live generators. ---------- components: Library (Lib) messages: 129213 nosy: cool-RR priority: normal severity: normal status: open title: Allow deepcopying and pickling paused generators type: feature request versions: Python 3.3 _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue11299> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com