Description
Summary
When calling deepcopy on a proto, the oneOf field state gets overwritten.
Reproduction Steps
- Create a simple proto with two one_of fields.
- set the first field
- Call which_one_of which will return the first field
- Call deepcopy on the proto
- check which_one_of again.
- The second field is returned.
The implementation of deepcopy does this:
for name in self._betterproto.sorted_field_names:
value = self.__raw_get(name)
if value is not PLACEHOLDER:
kwargs[name] = deepcopy(value)
And of course, setattr sets the current group by field, which overwrites this.
one option is to simply make deepcopy one_of aware, using oneof_field_by_group, default initializing the nonset fields and adding them to a set, and then only iterating over the names that aren't in the set using the overall loop above.
Expected Results
We preserve the correct one_of field
Actual Results
The second one_of field is set.
System Information
libprotoc 3.21.12
Python 3.11.9
Name: betterproto
Version: 2.0.0b6
Summary: A better Protobuf / gRPC generator & library
Home-page: https://github.com/danielgtaylor/python-betterproto
Author: Daniel G. Taylor
Author-email: [email protected]
License: MIT
Location: /usr/local/lib/python3.11/site-packages
Requires: grpclib, python-dateutil
Required-by:
Checklist
- I have searched the issues for duplicates.
- I have shown the entire traceback, if possible.
- I have verified this issue occurs on the latest prelease of betterproto which can be installed using
pip install -U --pre betterproto
, if possible.