44import dataclasses
55import datetime
66import decimal
7+ import functools
78import ipaddress
89import logging
910import pathlib
@@ -268,6 +269,10 @@ def skip_if_false(v):
268269 return not bool (v )
269270
270271
272+ def skip_if_default (v , default = None ):
273+ return v == default
274+
275+
271276@dataclass
272277class FlattenOpts :
273278 """
@@ -280,7 +285,8 @@ def field(
280285 rename : Optional [str ] = None ,
281286 skip : Optional [bool ] = None ,
282287 skip_if : Optional [Callable ] = None ,
283- skip_if_false : Optional [Callable ] = None ,
288+ skip_if_false : Optional [bool ] = None ,
289+ skip_if_default : Optional [bool ] = None ,
284290 serializer = None ,
285291 deserializer = None ,
286292 flatten : Optional [FlattenOpts ] = None ,
@@ -301,6 +307,8 @@ def field(
301307 metadata ["serde_skip_if" ] = skip_if
302308 if skip_if_false is not None :
303309 metadata ["serde_skip_if_false" ] = skip_if_false
310+ if skip_if_default is not None :
311+ metadata ["serde_skip_if_default" ] = skip_if_default
304312 if serializer :
305313 metadata ["serde_serializer" ] = serializer
306314 if deserializer :
@@ -355,6 +363,9 @@ class Foo:
355363 * `skip_if_false` (Attribute name: `serde_skip_if_false`) skips (de)serialization if the field value evaluates
356364 to `False`. For example, this code skip (de)serialize `v` if `v` is empty.
357365
366+ * `skip_if_default` (Attribute name: `serde_skip_if_default`) skips (de)serialization if the field value is equal
367+ to the default value
368+
358369 ```python
359370 @deserialize
360371 @serialize
@@ -387,6 +398,7 @@ class Foo:
387398 skip : Optional [bool ] = None
388399 skip_if : Optional [Func ] = None
389400 skip_if_false : Optional [bool ] = None
401+ skip_if_default : Optional [bool ] = None
390402 serializer : Optional [Func ] = None # Custom field serializer.
391403 deserializer : Optional [Func ] = None # Custom field deserializer.
392404 flatten : Optional [FlattenOpts ] = None
@@ -398,7 +410,12 @@ def from_dataclass(cls, f: dataclasses.Field) -> 'Field':
398410 """
399411 skip_if_false_func : Optional [Func ] = None
400412 if f .metadata .get ('serde_skip_if_false' ):
401- skip_if_false_func = Func (skip_if_false , cls .mangle (f , 'skip_if' ))
413+ skip_if_false_func = Func (skip_if_false , cls .mangle (f , 'skip_if_false' ))
414+
415+ skip_if_default_func : Optional [Func ] = None
416+ if f .metadata .get ('serde_skip_if_default' ):
417+ skip_if_def = functools .partial (skip_if_default , default = f .default )
418+ skip_if_default_func = Func (skip_if_def , cls .mangle (f , 'skip_if_default' ))
402419
403420 skip_if : Optional [Func ] = None
404421 if f .metadata .get ('serde_skip_if' ):
@@ -432,7 +449,7 @@ def from_dataclass(cls, f: dataclasses.Field) -> 'Field':
432449 metadata = f .metadata ,
433450 rename = f .metadata .get ('serde_rename' ),
434451 skip = f .metadata .get ('serde_skip' ),
435- skip_if = skip_if or skip_if_false_func ,
452+ skip_if = skip_if or skip_if_false_func or skip_if_default_func ,
436453 serializer = serializer ,
437454 deserializer = deserializer ,
438455 flatten = flatten ,
0 commit comments