読者です 読者をやめる 読者になる 読者になる

破棄されたブログ

このブログは破棄されました。

Python でカジュアルにイミュータブルな型を作る

collections.namedtuple を使うと簡単にイミュータブルな型を作れる。 明示的にフィールドを示せるので、状態を変更する必要がないときとか、関数型っぽく書きたいときに便利。 あとは、 DDD のバリューオブジェクト作るときにもよさげ。

import collections
import unittest

ImmutableType = collections.namedtuple("ImmutableType", ("field_1", "filed_2"))


class ImmutableTypeTestCase(unittest.TestCase):

    def test_should_be_creatable(self):
        instance = ImmutableType(1, 2)
        self.assertEqual(instance.field_1, 1)
        self.assertEqual(instance.field_2, 2)

    def test_should_be_immutable(self):
        instance = ImmutableType(1, 2)
        with self.assertRaises(AttributeError):
            instance.field_1 = 42

継承してサブクラスを作ることもできる。 ただし、 str すると親クラスの名前が維持されているので、デバッグするときとかには見づらい。

class SubCls(ImmutableType):

    def get_fields(self):
        return (self.field_1, self.field_2)


class SubClsTestCase(unittest.TestCase):

    def test_should_return_field_values(self):
        fields = (1, 2)
        instance = SubCls(*fields)
        self.assertEqual(instance.get_fields(), fields)

    def test_should_have_self_name(self):
        self.assertEqual(SubCls.__name__, "SubCls")

    def test_should_remain_parent_repr(self):
        instance = SubCls(1, 2)
        expected = "ImmutableType(field_1=1, field_2=2)"
        self.assertEqual(str(instance), expected)

参考資料

広告を非表示にする