Search code examples
pythonpython-dataclasses

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


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 do not 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.


Solution

  • I think that looping over the fields probably is the easiest way. All the other options I can think of involve creating a new object.

    from dataclasses import fields
    
    marker_a = Marker(5)
    marker_b = Marker(0, 99)
    
    for field in fields(Marker):
        setattr(marker_b, field.name, getattr(marker_a, field.name))
    
    print(marker_b)  # Marker(a=5, b=1.0)