diff --git a/changes/4361-hramezani.md b/changes/4361-hramezani.md new file mode 100644 index 00000000000..72d9a7936d0 --- /dev/null +++ b/changes/4361-hramezani.md @@ -0,0 +1 @@ +Fix `__post_init_post_parse__` is incorrectly passed keyword arguments when no `__post_init__` is defined diff --git a/pydantic/dataclasses.py b/pydantic/dataclasses.py index 23178cf8f7e..abfe7d1322f 100644 --- a/pydantic/dataclasses.py +++ b/pydantic/dataclasses.py @@ -310,8 +310,10 @@ def new_init(self: 'Dataclass', *args: Any, **kwargs: Any) -> None: # set arg value by default initvars_and_values[f.name] = args[i] except IndexError: - initvars_and_values[f.name] = f.default - initvars_and_values.update(kwargs) + if f.name in kwargs: + initvars_and_values[f.name] = kwargs[f.name] + else: + initvars_and_values[f.name] = f.default self.__post_init_post_parse__(**initvars_and_values) diff --git a/tests/test_dataclasses.py b/tests/test_dataclasses.py index f74b0874854..56ed9bf398f 100644 --- a/tests/test_dataclasses.py +++ b/tests/test_dataclasses.py @@ -600,6 +600,17 @@ def __post_init_post_parse__(self, base_path): assert PathDataPostInitPostParse('world', base_path='/hello').path == Path('/hello/world') +def test_post_init_post_parse_without_initvars(): + @pydantic.dataclasses.dataclass + class Foo: + a: int + + def __post_init_post_parse__(self): + ... + + Foo(a=1) + + def test_classvar(): @pydantic.dataclasses.dataclass class TestClassVar: