danielgtaylor / danielgtaylor/python-betterproto

to_dict() fails to write boolean fields without default when value is False

Open
#95 3 comments 0 reactions 0 assignees View on GitHub
enhancement medium medium priority
Dominant language
Python
Stars
1.8k
Forks
234
PR merge metrics
No merged PRs in 30d

Description

When you have a message with a boolean value as follows:
```
message Patient {
bool isRnaAvailable = 1;
}
```
then an object like
```
patient = Patient()
patient.is_rna_available = np.random.choice([True, False], 1)[0]
```
fails to write the `is_rna_available` field when it is False when calling `patient.to_dict()`, this does not happen when the value is True.

The issue seems to be in line 824 of file `betterproto/__init__py` where it runs the following comparison `elif v != self._get_field_default(field, meta) or include_default_values:`. It should be something like 'elif v != None or include_default_values', otherwise when you set a field to the same value as the default value and do not set `include_default values` then it is not written. This may be also the case for other types.

Contributor guide

Open the contributing guide

Research direction

Start in betterproto/__init__.py at the to_dict() logic around line 824 and reproduce the Patient example with is_rna_available set to False. Check how fields equal to their defaults are handled, including other field types, and verify that the resulting dictionary preserves explicitly assigned false values without requiring include_default_values.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
api, backend
Issue type
Bug
Difficulty
2/5
Estimated time
1-3 hours
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.