from marshmallow import fields from typing import Any NO_VALUE = "___NO_VALUE" class NullToFieldMixin: """Marshmallow allow_none=True does not work inside a container: f = List(Int(allow_none=True)) rises for value=[1,2,null]. So there is a mixin for custom fields classes to be used inside container: f = List(IntOrNull(allow_none=True, null_as=None)) returns [1,2,None] for value=[1,2,null]. """ def __init__(self, *args, null_to: Any = NO_VALUE, **kwargs): self.null_to = null_to super().__init__(*args, **kwargs) def _deserialize(self, value, attr, data, **kwargs): if self.null_to != NO_VALUE and value == "null": return self.null_to return super()._deserialize(value, attr, data, **kwargs) class IntOrNull(NullToFieldMixin, fields.Int): pass