Skip to content

Commit c28b43d

Browse files
authored
Fix a bug in nested vanila dataclass (#357)
1 parent d8e00c8 commit c28b43d

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

pydantic_settings/sources.py

+6-2
Original file line numberDiff line numberDiff line change
@@ -698,7 +698,7 @@ class Cfg(BaseSettings):
698698
elif is_model_class(annotation) or is_pydantic_dataclass(annotation):
699699
fields = (
700700
annotation.__pydantic_fields__
701-
if is_pydantic_dataclass(annotation)
701+
if is_pydantic_dataclass(annotation) and hasattr(annotation, '__pydantic_fields__')
702702
else cast(BaseModel, annotation).model_fields
703703
)
704704
# `case_sensitive is None` is here to be compatible with the old behavior.
@@ -1279,7 +1279,11 @@ def _get_resolved_names(
12791279

12801280
def _sort_arg_fields(self, model: type[BaseModel]) -> list[tuple[str, FieldInfo]]:
12811281
positional_args, subcommand_args, optional_args = [], [], []
1282-
fields = model.__pydantic_fields__ if is_pydantic_dataclass(model) else model.model_fields
1282+
fields = (
1283+
model.__pydantic_fields__
1284+
if hasattr(model, '__pydantic_fields__') and is_pydantic_dataclass(model)
1285+
else model.model_fields
1286+
)
12831287
for field_name, field_info in fields.items():
12841288
if _CliSubCommand in field_info.metadata:
12851289
if not field_info.is_required():

tests/test_settings.py

+18
Original file line numberDiff line numberDiff line change
@@ -690,6 +690,24 @@ class Settings(BaseSettings, env_nested_delimiter='__'):
690690
assert s.n.bar == 'bar value'
691691

692692

693+
def test_nested_vanila_dataclass(env):
694+
@dataclasses.dataclass
695+
class MyDataclass:
696+
value: str
697+
698+
class NestedSettings(BaseSettings, MyDataclass):
699+
pass
700+
701+
class Settings(BaseSettings):
702+
model_config = SettingsConfigDict(env_nested_delimiter='__')
703+
704+
sub: NestedSettings
705+
706+
env.set('SUB__VALUE', 'something')
707+
s = Settings()
708+
assert s.sub.value == 'something'
709+
710+
693711
def test_env_takes_precedence(env):
694712
class Settings(BaseSettings):
695713
foo: int

0 commit comments

Comments
 (0)