ふと、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 を使えばいいんだけども。