pythonpython-3.xmarshmallowwebargs

Dictionary vs Marshmallow dataclass schemas for webargs


The webargs module allows to describe argument schemas as a pure dictionary or marshmallow dataclass schema:

# Dictionary variant
@use_args({'field1': field.Int(required=True, validate=validate.Range(min=1))}, location='json')
def post(args: Dict[str, any]):
    controller.post(args)

# Marshmallow dataclass schema
@dataclass()
class Arg:
    field1: int = field(metadata=dict(required=True, validate=validate.Range(min=1)))

@use_args(Arg.Schema(), location='json')
def post(arg: Arg):
    controller.post(arg)

The first variant looks shorter and faster but we lose syntax highlight and type checks in IDE (cuz it's dict) and also it leads to longer calls, i.e. args['field1'] instead of arg.field1.

Which variant do you use in your big projects? Are there some best practices when to use the first or second variant?


Solution

  • There is no best practice. It is a matter of preference, really.

    Sometimes, people think that a schema is too much code for just just one or two query args and a dict is enough.

    I like to use schemas everywhere. I find it more consistent and it allows all schemas to derive from a base schema to inherit Meta parameters.

    I don't use marshmallow dataclass, just pure marshmallow, so I always get a dict anyway.