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じゃないので安心して巨大なジェネレータ内包を突っ込んでも大丈夫だ。