型の宣言をしてコンストラクタでassert

なんかJava的な頭で設計しているとこんなことを書きたくなったりするじゃない。「ヒットポイントは整数でー」と。実際にはPythonではこういう書き方はしないわけだけど。

class Monster(object):
    hitpoint = int
    defense = int
    attack = int

で、コードをいきなり書かずにこういう書き方で設計を練っていたので、せっかくだからそれを有効活用するというのはどうだろうかと思った。コンストラクタの終了時のアサーションに使う。

class Monster(object):
    field_types = dict(
        hitpoint=int,
        defense=int,
        attack=int,
    )
    def __init__(self, **kw):
        self.__dict__.update(kw)

        for k, v in self.field_types.items():
            assert isinstance(getattr(self, k), v)

「Monster(attack=1, defence=1, hitpoint=1)」なんて感じにミスタイプをするとassertで止まる。fail-fast。メタクラスで「__init__の最後にこういう処理をする」ってのを自動的に付け加えることもできるけど、さすがにちょっとやりすぎな感じがするなぁ。