@@ -664,21 +664,6 @@ def _field_for_generic_type(
664
664
# Override base_schema.TYPE_MAPPING to change the class used for generic types below
665
665
type_mapping = base_schema .TYPE_MAPPING if base_schema else {}
666
666
667
- if origin is Annotated :
668
- marshmallow_annotations = [
669
- arg
670
- for arg in arguments [1 :]
671
- if (inspect .isclass (arg ) and issubclass (arg , marshmallow .fields .Field ))
672
- or isinstance (arg , marshmallow .fields .Field )
673
- ]
674
- if marshmallow_annotations :
675
- field = marshmallow_annotations [- 1 ]
676
- # Got a field instance, return as is. User must know what they're doing
677
- if isinstance (field , marshmallow .fields .Field ):
678
- return field
679
-
680
- return field (** metadata )
681
-
682
667
if origin in (list , List ):
683
668
child_type = _field_for_schema (arguments [0 ], base_schema = base_schema )
684
669
list_type = cast (
@@ -728,6 +713,41 @@ def _field_for_generic_type(
728
713
** metadata ,
729
714
)
730
715
716
+ return None
717
+
718
+
719
+ def _field_for_annotated_type (
720
+ typ : type ,
721
+ ** metadata : Any ,
722
+ ) -> Optional [marshmallow .fields .Field ]:
723
+ """
724
+ If the type is an Annotated interface, resolve the arguments and construct the appropriate Field.
725
+ """
726
+ origin = typing_extensions .get_origin (typ )
727
+ arguments = typing_extensions .get_args (typ )
728
+ if origin and origin is Annotated :
729
+ marshmallow_annotations = [
730
+ arg
731
+ for arg in arguments [1 :]
732
+ if (inspect .isclass (arg ) and issubclass (arg , marshmallow .fields .Field ))
733
+ or isinstance (arg , marshmallow .fields .Field )
734
+ ]
735
+ if marshmallow_annotations :
736
+ field = marshmallow_annotations [- 1 ]
737
+ # Got a field instance, return as is. User must know what they're doing
738
+ if isinstance (field , marshmallow .fields .Field ):
739
+ return field
740
+
741
+ return field (** metadata )
742
+ return None
743
+
744
+
745
+ def _field_for_union_type (
746
+ typ : type ,
747
+ base_schema : Optional [Type [marshmallow .Schema ]],
748
+ ** metadata : Any ,
749
+ ) -> Optional [marshmallow .fields .Field ]:
750
+ arguments = typing_extensions .get_args (typ )
731
751
if typing_inspect .is_union_type (typ ):
732
752
if typing_inspect .is_optional_type (typ ):
733
753
metadata ["allow_none" ] = metadata .get ("allow_none" , True )
@@ -887,6 +907,14 @@ def _field_for_schema(
887
907
subtyp = Any
888
908
return _field_for_schema (subtyp , default , metadata , base_schema )
889
909
910
+ annotated_field = _field_for_annotated_type (typ , ** metadata )
911
+ if annotated_field :
912
+ return annotated_field
913
+
914
+ union_field = _field_for_union_type (typ , base_schema , ** metadata )
915
+ if union_field :
916
+ return union_field
917
+
890
918
# Generic types
891
919
generic_field = _field_for_generic_type (typ , base_schema , ** metadata )
892
920
if generic_field :
0 commit comments