Following examples here: Class inheritance in Python 3.7 dataclasses.
I'm trying to use inheritance in Python 3.8 dataclasses.
It works fine when I hardcode "child" class but does not work when I try to dynamically create class on the fly. I'm assuming I am doing something silly.
import types
from dataclasses import dataclass
@dataclass
class ParentBase:
field_1: str
field_2: str
@dataclass
class ParentDefaults:
field_3: str = "foo3"
@dataclass
class Parent(ParentDefaults, ParentBase):
pass
@dataclass
class ChildBase(ParentBase):
field_4: str
@dataclass
class ChildDefaults(ParentDefaults):
field_5: str = "foo5"
@dataclass
class Child(Parent, ChildDefaults, ChildBase):
pass
parent = {"field_1": "foo1", "field_2": "foo2"}
child = {**parent, **{"field_4": "foo4"}}
Parent(**parent)
Parent(field_1='foo1', field_2='foo2', field_3='foo3')
Child(**child)
Child(field_1='foo1', field_2='foo2', field_4='foo4', field_3='foo3', field_5='foo5')
Child2 = type("Child", (Parent, ChildDefaults, ChildBase), {})
Child2(**child)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-29-a0b94b0b4899> in <module>
----> 1 Child2(**child)
TypeError: __init__() got an unexpected keyword argument 'field_4'
Child.mro()
[__main__.Child,
__main__.Parent,
__main__.ChildDefaults,
__main__.ParentDefaults,
__main__.ChildBase,
__main__.ParentBase,
object]
Child2.mro()
[__main__.Child,
__main__.Parent,
__main__.ChildDefaults,
__main__.ParentDefaults,
__main__.ChildBase,
__main__.ParentBase,
object]
from dataclasses import fields
[field.name for field in fields(Child)]
['field_1', 'field_2', 'field_4', 'field_3', 'field_5']
[field.name for field in fields(Child2)]
['field_1', 'field_2', 'field_3']