From 1d68eb638c93043b389f90c95edb37ffb457fcd8 Mon Sep 17 00:00:00 2001 From: Hasan Ramezani Date: Wed, 10 Aug 2022 00:19:54 +0200 Subject: [PATCH] Fix __post_init_post_parse__ is incorrectly passed keyword arguments when no __post_init__ is defined --- pydantic/dataclasses.py | 6 ++++-- tests/test_dataclasses.py | 11 +++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) 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: