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)
困った時にはソースコードを読めば解決する。