LoginSignup
0
0

More than 5 years have passed since last update.

marshmallowのload(deserialization)時とdump(serialization)時のデフォルト値について

Last updated at Posted at 2016-12-27

marshmallow のschemaにデフォルト値を設定したい。

load/dumpのデフォルト値

marshmallowでは以下のような対応になっている。

  • load() -- 文字列表現をオブジェクト表現をする処理(deserialization)
  • dump() -- オブジェクト表現を文字列表現にする処理(serialization)

これら2つのそれぞれについてデフォルト値を設定するオプションがある。

  • load() -- missing
  • dump() -- default

以下の様にして使う。

from marshmallow import Schema, fields


class S(Schema):
    n = fields.Integer(missing=1, default=-1)

print(S().load({}))
# UnmarshalResult(data={'n': 1}, errors={})
print(S().dump({}))
# MarshalResult(data={'n': -1}, errors={})

collectionの値に対してdefault値を設定したい場合

many=True は関係無いので注意。コレクションの値のfieldsは fields.List を使う。

from marshmallow import Schema, fields


class S(Schema):
    nums = fields.List(fields.Integer(), missing=[1, 2, 3], default=[-1, -2, -3])

# # 以下ではない
# class S(Schema):
#     nums = fields.Integer(many=True, missing=[1, 2, 3], default=[-1, -2, -3])

print(S().load({}))
# UnmarshalResult(data={'nums': [1, 2, 3]}, errors={})
print(S().dump({}))
# MarshalResult(data={'nums': [-1, -2, -3]}, errors={})

ただしlistはmutableなので以下のように関数で包んだほうが無難

from marshmallow import Schema, fields


class S(Schema):
    nums = fields.List(fields.Integer(), missing=lambda: [1, 2, 3], default=lambda: [-1, -2, -3])

参考

0
0
0

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
0
0