LoginSignup
11
10

More than 5 years have passed since last update.

schemaライブラリのmarshmallowの使い方のメモ

Last updated at Posted at 2016-12-15

marshmallow ?

このライブラリのこと。schemaライブラリ。

quick startを読む

quick startを読む

結構細かく書かれているので読むと良い。

雑な使い方は以下のようなもの(quick startはもっと詳しい)。

schema定義

from marshmallow import Schema, fields

# schema 定義
class Perseon(Schema):
    name = fields.String()
    age = fields.Integer()

schemaの利用(load/dump)

# load(json.loads的なイメージ)
data, errs = Person().load({"name": "foo", "age": "10"})

# dump
dumped, errs = Person().dump(data)

load() ,dump() で返される値は data,errorsを値に持つnamedtuple。なので Person.dump(data).data などと書く事もできる。

strict mode

defaultではvalidationに引っかかってもエラーにならない。エラーにするにはstrict modeを有効にする。

Person(strict=True).load({})

読んだ後の話

以下の点に注意

  • defaultではstrict modeがfalse
  • schema定義に存在しない値は自動で消される
  • required=True は明示的に付けないとrequiredにならない
  • defaultでdumpの update_fields=True

defaultではstrict modeがfalse

個人的にはdefaultでtrueが良いので基本的にはMetaでstrict=Trueにしている。

class Person(Schema):
    name = fields.String()

    class Meta:
        strict = True

Person().load({})  # marshmallow.ValidationError

strictを外したい時に明示的に strict=False を渡している。

data, err = Person(strict=False).load({})

schema定義に存在しない値は自動で消される

schema定義に存在しない値は自動で消される。必要なフィールドはしっかり定義してあげないとだめなので注意。

class Person(Schema):
    name = fields.String()

data, _ = Person().load({"name": "foo", "age": 20})
print(data)  # => {"name": "foo"}

required=True は明示的に付けないとrequiredにならない

このnameはrequiredにならない。明示的にrequiredを付けないとだめ。

class Person(Schema):
    name = fields.String()

こう。

class Person(Schema):
    name = fields.String(required=True)

これはMetaでfieldsを指定する時も同様。つまりMeta.fieldsでrequiredなfieldsを定義できない

class Person(Schema):
    class Meta:
        filds = ("name",)

defaultでdumpの update_fields=True

これは細かい話だけれど。パフォーマンスのベンチマークをしたい場合に注意。marshmallowはデフォルトでupdate_fieldsがtrueになっている。これは渡されたデータの値を利用して自動で定義されたfieldなどの型に対する扱いを良い感じに変更するというような機能。たとえば数値を渡したあとには単なるfields.Fieldからfields.Integerになるみたいなもの。

便利なのだけれど。結構負荷が掛かる処理ではあるので速度が気になる場合にはoffにすると良い。尚metaでは指定はできない模様。

schema.dump(data, update_fields=False)

困った時にはソースコードを読めば解決する。

11
10
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
10