From 149c05bc2ee85fcb210e79a3e39b7df5f929e2c4 Mon Sep 17 00:00:00 2001 From: Hasan Ramezani Date: Thu, 11 Aug 2022 12:40:50 +0200 Subject: [PATCH] Fix __post_init_post_parse__ is incorrectly passed keyword arguments when no __post_init__ is defined (#4361) --- changes/4361-hramezani.md | 1 + pydantic/dataclasses.py | 3 +-- tests/test_dataclasses.py | 11 +++++++++++ 3 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 changes/4361-hramezani.md diff --git a/changes/4361-hramezani.md b/changes/4361-hramezani.md new file mode 100644 index 0000000000..72d9a7936d --- /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 23178cf8f7..1ce738bde5 100644 --- a/pydantic/dataclasses.py +++ b/pydantic/dataclasses.py @@ -310,8 +310,7 @@ 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) + initvars_and_values[f.name] = kwargs.get(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 f74b087485..56ed9bf398 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: