Reputation: 7267
How can I update the fields of a dataclass using a dict?
Example:
@dataclass
class Sample:
field1: str
field2: str
field3: str
field4: str
sample = Sample('field1_value1', 'field2_value1', 'field3_value1', 'field4_value1')
updated_values = {'field1': 'field1_value2', 'field3': 'field3_value2'}
I want to do something like
sample.update(updated_values)
Upvotes: 11
Views: 9134
Reputation: 9336
@DanStewart's solution seems to work but when you see members that start
and end with __
you should avoid modifying them directly: since python does not have private/protected visibility, __
is the way to warn the programmer that those methods/variables are only for within class usage, not intended to be part of the interface.
A better method is to use replace
as in this answer
from dataclasses import replace
sample = replace(sample, **updated_values)
Upvotes: 2
Reputation: 121
Updating the underlying __dict__
seems to work if you have a basic dataclass:
sample.__dict__.update({ 'field1': 'value1' })
Upvotes: 10
Reputation: 1599
One way is to make a small class and inherit from it:
class Updateable(object):
def update(self, new):
for key, value in new.items():
if hasattr(self, key):
setattr(self, key, value)
@dataclass
class Sample(Updateable):
field1: str
field2: str
field3: str
field4: str
You can read this if you want to learn more about getattr and setattr
Upvotes: 10