|
21 | 21 | from ..utils import ( |
22 | 22 | _annotation_contains_types, |
23 | 23 | _annotation_enum_name_to_val, |
| 24 | + _annotation_is_complex, |
24 | 25 | _get_model_fields, |
25 | 26 | _union_is_complex, |
26 | 27 | parse_env_vars, |
@@ -209,7 +210,7 @@ class Cfg(BaseSettings): |
209 | 210 | return f |
210 | 211 | return None |
211 | 212 |
|
212 | | - def explode_env_vars(self, field_name: str, field: FieldInfo, env_vars: Mapping[str, str | None]) -> dict[str, Any]: |
| 213 | + def explode_env_vars(self, field_name: str, field: FieldInfo, env_vars: Mapping[str, str | None]) -> dict[str, Any]: # noqa: C901 |
213 | 214 | """ |
214 | 215 | Process env_vars and extract the values of keys containing env_nested_delimiter into nested dictionaries. |
215 | 216 |
|
@@ -253,17 +254,22 @@ def explode_env_vars(self, field_name: str, field: FieldInfo, env_vars: Mapping[ |
253 | 254 |
|
254 | 255 | # check if env_val maps to a complex field and if so, parse the env_val |
255 | 256 | if (target_field or is_dict) and env_val: |
256 | | - if target_field: |
| 257 | + if isinstance(target_field, FieldInfo): |
257 | 258 | is_complex, allow_json_failure = self._field_is_complex(target_field) |
258 | 259 | if self.env_parse_enums: |
259 | 260 | enum_val = _annotation_enum_name_to_val(target_field.annotation, env_val) |
260 | 261 | env_val = env_val if enum_val is None else enum_val |
| 262 | + elif target_field: |
| 263 | + # target_field is a raw type (e.g. from dict value type annotation) |
| 264 | + is_complex = _annotation_is_complex(target_field, []) |
| 265 | + allow_json_failure = True |
261 | 266 | else: |
262 | 267 | # nested field type is dict |
263 | 268 | is_complex, allow_json_failure = True, True |
264 | 269 | if is_complex: |
265 | 270 | try: |
266 | | - env_val = self.decode_complex_value(last_key, target_field, env_val) # type: ignore |
| 271 | + field_info = target_field if isinstance(target_field, FieldInfo) else None |
| 272 | + env_val = self.decode_complex_value(last_key, field_info, env_val) # type: ignore |
267 | 273 | except ValueError as e: |
268 | 274 | if not allow_json_failure: |
269 | 275 | raise e |
|
0 commit comments