Skip to content

Commit

Permalink
fix: always call __post_init__ when set in dataclasses
Browse files Browse the repository at this point in the history
  • Loading branch information
PrettyWood committed Sep 5, 2022
1 parent eccd85e commit b100e90
Show file tree
Hide file tree
Showing 3 changed files with 81 additions and 1 deletion.
1 change: 1 addition & 0 deletions changes/4477-PrettyWood.md
@@ -0,0 +1 @@
fix: dataclass wrapper was not always called
4 changes: 3 additions & 1 deletion pydantic/dataclasses.py
Expand Up @@ -184,7 +184,9 @@ def dataclass(
def wrap(cls: Type[Any]) -> 'DataclassClassOrWrapper':
import dataclasses

if is_builtin_dataclass(cls):
if is_builtin_dataclass(cls) and not (
is_builtin_dataclass(cls.__bases__[0]) and not hasattr(cls.__bases__[0], '__post_init__')
):
dc_cls_doc = ''
dc_cls = DataclassProxy(cls)
default_validate_on_init = False
Expand Down
77 changes: 77 additions & 0 deletions tests/test_dataclasses.py
Expand Up @@ -1395,3 +1395,80 @@ class Bar:
@pydantic.dataclasses.dataclass
class Foo:
a: List[Bar(a=1)]


def test_parent_post_init():
@dataclasses.dataclass
class A:
a: float = 1

def __post_init__(self):
self.a *= 2

@pydantic.dataclasses.dataclass
class B(A):
@validator('a')
def validate_a(cls, value):
value += 3
return value

assert B().a == 5 # 1 * 2 + 3


def test_subclass_post_init_post_parse():
@dataclasses.dataclass
class A:
a: float = 1

@pydantic.dataclasses.dataclass
class B(A):
def __post_init_post_parse__(self):
self.a *= 2

@validator('a')
def validate_a(cls, value):
value += 3
return value

assert B().a == 8 # (1 + 3) * 2


def test_subclass_post_init():
@dataclasses.dataclass
class A:
a: int = 1

@pydantic.dataclasses.dataclass
class B(A):
def __post_init__(self):
self.a *= 2

@validator('a')
def validate_a(cls, value):
value += 3
return value

assert B().a == 5 # 1 * 2 + 3


def test_subclass_post_init_inheritance():
@dataclasses.dataclass
class A:
a: int = 1

@pydantic.dataclasses.dataclass
class B(A):
def __post_init__(self):
self.a *= 2

@validator('a')
def validate_a(cls, value):
value += 3
return value

@pydantic.dataclasses.dataclass
class C(B):
def __post_init__(self):
self.a *= 3

assert C().a == 6 # 1 * 3 + 3

0 comments on commit b100e90

Please sign in to comment.