@@ -83,6 +83,7 @@ class EnumMixin(
83
83
enum : Optional [Type [Enum ]] = None
84
84
strict : bool = True
85
85
coerce : bool = True
86
+ primitive : Optional [Type [Any ]] = None
86
87
87
88
descriptor_class = ToPythonDeferredAttribute
88
89
@@ -91,7 +92,7 @@ def _coerce_to_value_type(self, value: Any) -> Enum:
91
92
# note if enum type is int and a floating point is passed we could get
92
93
# situations like X.xxx == X - this is acceptable
93
94
if self .enum :
94
- return type ( values ( self .enum )[ 0 ]) (value )
95
+ return self .primitive (value )
95
96
# can't ever reach this - just here to make type checker happy
96
97
return value # pragma: no cover
97
98
@@ -109,6 +110,7 @@ def __init__(
109
110
self .coerce = coerce if enum else False
110
111
if self .enum is not None :
111
112
kwargs .setdefault ('choices' , choices (enum ))
113
+ self .primitive = type (values (self .enum )[0 ])
112
114
super ().__init__ (* args , ** kwargs )
113
115
114
116
def _try_coerce (
@@ -145,6 +147,18 @@ def _try_coerce(
145
147
f"{ self .enum .__name__ } "
146
148
f"required by field { self .name } ."
147
149
) 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
148
162
return value
149
163
150
164
def deconstruct (self ) -> Tuple [str , str , List , dict ]:
0 commit comments