Pythonでクロージャ

ふと、Pythonクロージャで変数保持するのどうやってたっけな、と思って書いた。
関数の __dict__ で保持すればいいじゃないの、という話。

import unittest

def make_counter(n=0):
    def _():
        _.count += 1
        return _.count
    _.count = n
    return _

class MakeCounterTestCase(unittest.TestCase):
    def setUp(self):
        self.c1 = make_counter()
        self.c2 = make_counter(5)

    def test_single(self):
        self.assertEqual(self.c1(), 1)
        self.assertEqual(self.c1(), 2)
        self.assertEqual(self.c1(), 3)

    def test_double(self):
        self.assertEqual(self.c1(), 1)
        self.assertEqual(self.c1(), 2)
        self.assertEqual(self.c2(), 6)
        self.assertEqual(self.c2(), 7)
        self.assertEqual(self.c1(), 3)
        self.assertEqual(self.c2(), 8)

if __name__ == '__main__':
    unittest.main()

特に問題なさそう。まあ、カウンターがほしければ itertools.count を使えばいいんだけども。