ジェネレータのコピー

自分で定義したジェネレータのインスタンスをコピーできない。

>>> import copy
>>> def foo():
...     yield 1
...     yield 2
...
>>> copy.copy(foo())
...(略)...
TypeError: object.__new__(generator) is not safe, use generator.__new__()

もちろん、f1 = foo()、f2 = foo()としていけば複数のインスタンスが作成できるが、

>>> def bar(f):
...     # インスタンスfを複製したい
...     # もしくは、複数回fを呼び出したい

というように、インスタンスの情報しか分からない場合にコピーできない。itertools.cycleで回しても1つのリストの終端が分からないので使えない。自分で定義したジェネレータをコピーする方法は存在するのだろうか。


追記:
PEP 323を見てユーザ定義のジェネレータをコピーする方法が分かった。

>>> import itertools
>>> 
>>> def foo():
...     yield 1
...     yield 2
...
>>> f = foo()
>>> f1, f2 = itertools.tee(f)
>>> list(f1), list(f2)
([1, 2], [1, 2])

fとf1もしくは、fとf2は関連しているが、f1とf2は独立している。copyモジュールでコピーできれば簡単だが、今はなっていない。itertools.teeの使い道がやっと分かった。