sumはeagerかどうか
id:voluntasが「Erlangに移植するからHaskellのコードをわかりやすくPythonで書いて」と言ったので移植している。sumがeagerかどうか気になったので実験。
class Foo(object): def __init__(self, i): print "initialized %d" % i self.i = i def __add__(self, v): print "added %d and %d" % (self.i, v.i) return Foo(self.i + v.i) def __del__(self): print "deleted %d" % self.i def gen(): for i in range(3): yield Foo(i) sum(gen(), Foo(100))
実行結果
initialized 100 initialized 0 added 100 and 0 initialized 100 deleted 0 initialized 1 added 100 and 1 initialized 101 deleted 100 deleted 1 initialized 2 added 101 and 2 initialized 103 deleted 101 deleted 2 deleted 100 deleted 103
101とか作った後ですぐ1や100のデストラクタが走っているね。eagerじゃないので安心して巨大なジェネレータ内包を突っ込んでも大丈夫だ。