Easiest way to copy all fields from one dataclass instance to another?

Tom Pohl picture Tom Pohl · Sep 16, 2019 · Viewed 7k times · Source

Let's assume you have defined a Python dataclass:

@dataclass
class Marker:
    a: float
    b: float = 1.0

What's the easiest way to copy the values from an instance marker_a to another instance marker_b?

Here's an example of what I try to achieve:

marker_a = Marker(1.0, 2.0)
marker_b = Marker(11.0, 12.0)
# now some magic happens which you hopefully can fill in
print(marker_b)
# result: Marker(a=1.0, b=2.0)

As a boundary condition, I don't want to create and assign a new instance to marker_b. OK, I could loop through all defined fields and copy the values one by one, but there has to be a simpler way, I guess.

Answer

Daniel Perez picture Daniel Perez · Aug 29, 2020

The dataclasses.replace function returns a new copy of the object. Without passing in any changes, it will return a copy with no modification:

>>> import dataclasses
>>> @dataclasses.dataclass
... class Dummy:
...     foo: int
...     bar: int
... 
>>> dummy = Dummy(1, 2)
>>> dummy_copy = dataclasses.replace(dummy)
>>> dummy_copy.foo = 5
>>> dummy
Dummy(foo=1, bar=2)
>>> dummy_copy
Dummy(foo=5, bar=2)

Note that this is a shallow copy.