@@ -15,8 +15,7 @@ use super::errors::py_err_se_err;
1515use super :: extra:: Extra ;
1616use super :: filter:: SchemaFilter ;
1717use super :: infer:: { infer_json_key, infer_serialize, infer_to_python, SerializeInfer } ;
18- use super :: shared:: PydanticSerializer ;
19- use super :: shared:: { CombinedSerializer , TypeSerializer } ;
18+ use super :: shared:: { get_unset_sentinel_object, CombinedSerializer , PydanticSerializer , TypeSerializer } ;
2019
2120/// representation of a field for serialization
2221#[ derive( Debug ) ]
@@ -154,6 +153,7 @@ impl GeneralFieldsSerializer {
154153 ) -> PyResult < Bound < ' py , PyDict > > {
155154 let output_dict = PyDict :: new ( py) ;
156155 let mut used_req_fields: usize = 0 ;
156+ let unset_obj = get_unset_sentinel_object ( py) ;
157157
158158 // NOTE! we maintain the order of the input dict assuming that's right
159159 for result in main_iter {
@@ -163,6 +163,10 @@ impl GeneralFieldsSerializer {
163163 if extra. exclude_none && value. is_none ( ) {
164164 continue ;
165165 }
166+ if value. is ( unset_obj) {
167+ continue ;
168+ }
169+
166170 let field_extra = Extra {
167171 field_name : Some ( key_str) ,
168172 ..extra
@@ -238,9 +242,13 @@ impl GeneralFieldsSerializer {
238242
239243 for result in main_iter {
240244 let ( key, value) = result. map_err ( py_err_se_err) ?;
245+ let unset_obj = get_unset_sentinel_object ( value. py ( ) ) ;
241246 if extra. exclude_none && value. is_none ( ) {
242247 continue ;
243248 }
249+ if value. is ( unset_obj) {
250+ continue ;
251+ }
244252 let key_str = key_str ( & key) . map_err ( py_err_se_err) ?;
245253 let field_extra = Extra {
246254 field_name : Some ( key_str) ,
@@ -326,6 +334,7 @@ impl TypeSerializer for GeneralFieldsSerializer {
326334 extra : & Extra ,
327335 ) -> PyResult < PyObject > {
328336 let py = value. py ( ) ;
337+ let unset_obj = get_unset_sentinel_object ( py) ;
329338 // If there is already a model registered (from a dataclass, BaseModel)
330339 // then do not touch it
331340 // If there is no model, we (a TypedDict) are the model
@@ -347,6 +356,9 @@ impl TypeSerializer for GeneralFieldsSerializer {
347356 if extra. exclude_none && value. is_none ( ) {
348357 continue ;
349358 }
359+ if value. is ( unset_obj) {
360+ continue ;
361+ }
350362 if let Some ( ( next_include, next_exclude) ) = self . filter . key_filter ( & key, include, exclude) ? {
351363 let value = match & self . extra_serializer {
352364 Some ( serializer) => {
@@ -380,7 +392,7 @@ impl TypeSerializer for GeneralFieldsSerializer {
380392 extra. warnings . on_fallback_ser :: < S > ( self . get_name ( ) , value, extra) ?;
381393 return infer_serialize ( value, serializer, include, exclude, extra) ;
382394 } ;
383-
395+ let unset_obj = get_unset_sentinel_object ( value . py ( ) ) ;
384396 // If there is already a model registered (from a dataclass, BaseModel)
385397 // then do not touch it
386398 // If there is no model, we (a TypedDict) are the model
@@ -407,6 +419,9 @@ impl TypeSerializer for GeneralFieldsSerializer {
407419 if extra. exclude_none && value. is_none ( ) {
408420 continue ;
409421 }
422+ if value. is ( unset_obj) {
423+ continue ;
424+ }
410425 let filter = self . filter . key_filter ( & key, include, exclude) . map_err ( py_err_se_err) ?;
411426 if let Some ( ( next_include, next_exclude) ) = filter {
412427 let output_key = infer_json_key ( & key, extra) . map_err ( py_err_se_err) ?;
0 commit comments