BETA

Python の attrs で validation をかける

投稿日:2018-11-24
最終更新:2018-11-24

Python の attrs が便利すぎて、データ保持用のクラスを作る時なんかは専らコレばっかり使っています。

そんな attrs で入力されるデータに validation をかける方法です。

attrs で入力データをチェック

例えば Pose というクラスに対して、位置を表す position は長さ 3 の配列、向きを表す orientation は長さ 4 の配列(クォータニオン) であることをチェックする場合は以下のように書くことができます。

from attr import attrs, attrib


@attrs
class Pose:
    position = attrib()
    orientation = attrib()

    @position.validator
    def check_position(self, attribute, value):
        if len(value) != 3:
            raise ValueError("position must be a list with size=3")

    @orientation.validator
    def check_orientation(self, attribute, value):
        if len(value) != 4:
            raise ValueError("orientation must be a list with size=4")

正しい値を代入した場合

>>> Pose(position=[0, 1, 2], orientation=[0, 0, 0, 1])
Pose(position=[0, 1, 2], orientation=[0, 0, 0, 1])

不正な値を代入した場合

>>> Pose(position=[0, 1], orientation=[0, 0, 0, 0, 1])
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<attrs generated init d25cdc317f9cca07dcc37d3210f62862e6055553>", line 5, in __init__
  File "<stdin>", line 8, in check_position
ValueError: position must be a list with size=3

普通の class だと __init__ が肥大化したりしがちですが、これだとスッキリ書けますね!

関連サイト

技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
駆け出しエンジニアからエキスパートまで全ての方々のアウトプットを歓迎しております!
or 外部アカウントで 登録 / ログイン する
クランチについてもっと詳しく

この記事が掲載されているブログ

@yura'の技術ブログ

よく一緒に読まれる記事

0件のコメント

ブログ開設 or ログイン してコメントを送ってみよう
目次をみる
技術ブログをはじめよう Qrunch(クランチ)は、プログラマの技術アプトプットに特化したブログサービスです
or 外部アカウントではじめる
10秒で技術ブログが作れます!