@@ -83,6 +83,7 @@ class EnumMixin(
8383 enum : Optional [Type [Enum ]] = None
8484 strict : bool = True
8585 coerce : bool = True
86+ primitive : Optional [Type [Any ]] = None
8687
8788 descriptor_class = ToPythonDeferredAttribute
8889
@@ -91,7 +92,7 @@ def _coerce_to_value_type(self, value: Any) -> Enum:
9192 # note if enum type is int and a floating point is passed we could get
9293 # situations like X.xxx == X - this is acceptable
9394 if self .enum :
94- return type ( values ( self .enum )[ 0 ]) (value )
95+ return self .primitive (value )
9596 # can't ever reach this - just here to make type checker happy
9697 return value # pragma: no cover
9798
@@ -109,6 +110,7 @@ def __init__(
109110 self .coerce = coerce if enum else False
110111 if self .enum is not None :
111112 kwargs .setdefault ('choices' , choices (enum ))
113+ self .primitive = type (values (self .enum )[0 ])
112114 super ().__init__ (* args , ** kwargs )
113115
114116 def _try_coerce (
@@ -145,6 +147,18 @@ def _try_coerce(
145147 f"{ self .enum .__name__ } "
146148 f"required by field { self .name } ."
147149 ) from err
150+ elif (
151+ not self .coerce and self .primitive and
152+ not isinstance (value , self .primitive ) and
153+ self .enum and not isinstance (value , self .enum )
154+ ):
155+ try :
156+ value = self ._coerce_to_value_type (value )
157+ except (TypeError , ValueError ) as err :
158+ raise ValueError (
159+ f"'{ value } ' is not a valid { self .primitive } "
160+ f"required by field { self .name } ."
161+ ) from err
148162 return value
149163
150164 def deconstruct (self ) -> Tuple [str , str , List , dict ]:
0 commit comments