danielgtaylor / danielgtaylor/python-betterproto

Zeroes are not serialized with bytes() in proto2 syntax with required field

Offen
#676 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
bug investigation needed
Vorherrschende Sprache
Python
Sterne
1.8k
Forks
234
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

### Summary

There should be an alternative __bytes__ method that allows to serialize zeroes for proto2 syntax. Currently zeroes enums are skipped as they are "default" values which is incorrect because unless the field is optional, it must be present in encoded form.

### Reproduction Steps

1. Create a simple proto2 file:
```proto
message MyMessage {
enum MyEnum {
FOOBAR = 0;
BAZ = 1;
}
}
```
2. Compile to python:
```python3
@dataclass
class MyMessage(betterproto.Message):
# @required
action: "MyEnum" = betterproto.enum_field(1)

class MyEnum(betterproto.Enum):
FOOBAR = 0
BAZ = 1
```
3. Use the `FOOBAR` value (0):
```python3
print(
MyMessage(
action=MyEnum.FOOBAR,
)
)
```
You can see the MyEnum.FOOBAR here. However when you try to serialize it, the encoder skips this value incorrectly thinking it's default and hence shouldn't be added:
```python3
print(
MyMessage(
action=MyEnum.FOOBAR,
).to_json()
)
# or
print(
MyMessage(
action=MyEnum.FOOBAR,
).to_dict()
)
# or
print(
bytes(MyMessage(
action=MyEnum.FOOBAR,
))
)
```

This can only be "fixed" by passing include_default_values=True in to_json or to_dict:

```python3
print(
MyMessage(
action=MyEnum.FOOBAR,
).to_json(include_default_values=True)
)
```

But I need binary representation of the MyMessage class

### Expected Results

N/A

### Actual Results

N/A

### System Information

Latest beta version

### 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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne damit, das Problem mit den generierten MyMessage- und MyEnum.FOOBAR-Beispielen zu reproduzieren, und vergleiche dann bytes(), to_json() und to_dict() für das erforderliche proto2-Enum. Als erledigt gilt die Aufgabe, wenn die binäre Darstellung das Enum mit dem Wert null enthält, ohne include_default_values=True zu erfordern.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
python
Bereich
api
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
38/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.