danielgtaylor / danielgtaylor/python-betterproto
Deepcopy incorrectly sets the 'active' oneof field to last field in structure (breaking which_one_of)
- Ngôn ngữ chính
- Python
- Star
- 1.8k
- Fork
- 234
- Chỉ số merge pull request
- Không có pull request nào được merge trong 30 ngày
Mô tả
### Summary
When calling deepcopy on a proto, the oneOf field state gets overwritten.
### Reproduction Steps
1. Create a simple proto with two one_of fields.
2. set the first field
3. Call which_one_of which will return the first field
4. Call deepcopy on the proto
5. check which_one_of again.
6. 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: danielgtaylor@gmail.com
License: MIT
Location: /usr/local/lib/python3.11/site-packages
Requires: grpclib, python-dateutil
Required-by:
### Checklist
- [X] I have searched the issues for duplicates.
- [X] I have shown the entire traceback, if possible.
- [X] I have verified this issue occurs on the latest prelease of betterproto which can be installed using `pip install -U --pre betterproto`, if possible.
Hướng dẫn đóng góp
Hướng nghiên cứu
Bắt đầu từ phần triển khai __deepcopy__ được hiển thị trong issue và kiểm tra cách oneof_field_by_group biểu diễn trường đang hoạt động. Tái hiện trường hợp này với một proto chứa hai trường one_of, sau đó xác minh rằng deepcopy giữ nguyên trường được chọn trước khi sao chép và that which_one_of trả về cùng trường đó sau đó.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- python
- Lĩnh vực
- backend-api-design
- Loại issue
- Lỗi
- Độ khó
- 3/5
- Thời gian dự kiến
- 1-2 ngày
- Mức độ hoạt động
- Đình trệ
- Độ rõ ràng
- Đặc tả rõ ràng
- Mức phù hợp với người mới
- 45/100