import copy
from dataclasses import dataclass, field, InitVar, replace
@dataclass
class D:
a: float = 10. # Normal attribute with a default value
b: InitVar[float] = 20. # init-only attribute with a default value
c: float = field(init=False) # an attribute that will be defined in __post_init__
def __post_init__(self, b):
self.c = self.a + b
def copy_dataclass(D_class, d_obj):
input = {}
for key, value in d_obj.__dict__.items():
# If the attribute is passed to __init__
if d_obj.__dataclass_fields__[key].init:
input[key] = copy.deepcopy(value)
copy_d = D_class(**input)
return copy_d
d1 = D(1, 2)
d2 = copy_dataclass(D, d1)
print(d1, d2)
aW1wb3J0IGNvcHkKZnJvbSBkYXRhY2xhc3NlcyBpbXBvcnQgZGF0YWNsYXNzLCBmaWVsZCwgSW5pdFZhciwgcmVwbGFjZQoKQGRhdGFjbGFzcwpjbGFzcyBEOgogICAgYTogZmxvYXQgPSAxMC4gICAgICAgICAgICAgICAgIyBOb3JtYWwgYXR0cmlidXRlIHdpdGggYSBkZWZhdWx0IHZhbHVlCiAgICBiOiBJbml0VmFyW2Zsb2F0XSA9IDIwLiAgICAgICAjIGluaXQtb25seSBhdHRyaWJ1dGUgd2l0aCBhIGRlZmF1bHQgdmFsdWUgCiAgICBjOiBmbG9hdCA9IGZpZWxkKGluaXQ9RmFsc2UpICAjIGFuIGF0dHJpYnV0ZSB0aGF0IHdpbGwgYmUgZGVmaW5lZCBpbiBfX3Bvc3RfaW5pdF9fCiAgICAKICAgIGRlZiBfX3Bvc3RfaW5pdF9fKHNlbGYsIGIpOgogICAgICAgIHNlbGYuYyA9IHNlbGYuYSArIGIKCgpkZWYgY29weV9kYXRhY2xhc3MoRF9jbGFzcywgZF9vYmopOgogICAgaW5wdXQgPSB7fQogICAgZm9yIGtleSwgdmFsdWUgaW4gZF9vYmouX19kaWN0X18uaXRlbXMoKToKICAgICAgICAjIElmIHRoZSBhdHRyaWJ1dGUgaXMgcGFzc2VkIHRvIF9faW5pdF9fCiAgICAgICAgaWYgZF9vYmouX19kYXRhY2xhc3NfZmllbGRzX19ba2V5XS5pbml0OgogICAgICAgICAgICBpbnB1dFtrZXldID0gY29weS5kZWVwY29weSh2YWx1ZSkKICAgICAgICAKICAgIGNvcHlfZCA9IERfY2xhc3MoKippbnB1dCkKICAgIAogICAgcmV0dXJuIGNvcHlfZApkMSA9IEQoMSwgMikKZDIgPSBjb3B5X2RhdGFjbGFzcyhELCBkMSkKcHJpbnQoZDEsIGQyKQ==