Skip to content

Commit 2d2f94f

Browse files
authored
fix: superfluous deep env conflicts with non-dict model leaf (#276)
1 parent a4aadfd commit 2d2f94f

File tree

2 files changed

+20
-1
lines changed

2 files changed

+20
-1
lines changed

pydantic_settings/sources.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -638,7 +638,8 @@ def explode_env_vars(self, field_name: str, field: FieldInfo, env_vars: Mapping[
638638
except ValueError as e:
639639
if not allow_json_failure:
640640
raise e
641-
env_var[last_key] = env_val
641+
if isinstance(env_var, dict):
642+
env_var[last_key] = env_val
642643

643644
return result
644645

tests/test_settings.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2586,3 +2586,21 @@ class Settings(BaseSettings):
25862586
env.set('sub_dict__bar__foo', '{"b": 2}')
25872587
s = Settings()
25882588
assert s.model_dump() == {'nested': {'foo': {'a': 1}}, 'sub_dict': {'bar': {'foo': {'b': 2}}}}
2589+
2590+
2591+
def test_nested_models_leaf_vs_deeper_env_dict_assumed(env):
2592+
class NestedSettings(BaseModel):
2593+
foo: str
2594+
2595+
class Settings(BaseSettings):
2596+
model_config = SettingsConfigDict(env_nested_delimiter='__')
2597+
2598+
nested: NestedSettings
2599+
2600+
env.set('nested__foo', 'string')
2601+
env.set(
2602+
'nested__foo__bar',
2603+
'this should not be evaluated, since foo is a string by annotation and not a dict',
2604+
)
2605+
s = Settings()
2606+
assert s.model_dump() == {'nested': {'foo': 'string'}}

0 commit comments

Comments
 (0)