ジェネレータのコピー
自分で定義したジェネレータのインスタンスをコピーできない。
>>> 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の使い道がやっと分かった。