danielgtaylor / danielgtaylor/python-betterproto

Proposal to add default values in deserialisation

Ouverte
#356 5 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
Langage dominant
Python
Étoiles
1.8k
Forks
234
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

[Protobuf does not serialise default values](https://developers.google.com/protocol-buffers/docs/proto3#default), however the betterproto objects could retain them.

Consider:
```protobuf
enum MyType {
A = 0;
B = 1;
}

message MyMessage {
string name = 1;
MyType type = 2;
}
```

I create a new message with the default enum:
```
m = api.MyMessage(name='foo', type=api.MyType(0))
```

If I send this message, and the receiver creates a betterproto message, they get:
```
api.MyMessage(name='foo')
```

Fortunately betterproto has equality between these messages, even though in the latter type is not specified.

However, this is not particularly easy to find without a bit of digging. I believe it would be simpler to just add the default values when deserialising, which is actually pretty simple:

```python
def _fill_defaults(message: api.betterproto.Message) -> api.betterproto.Message:
message_keys = {}
for k in message.__dict__.keys():
if k not in ["_serialized_on_wire", "_unknown_fields", "_group_current"]:
current_value = getattr(message, k)
if not current_value:
message_keys[k] = message._get_field_default(k)
else:
message_keys[k] = current_value
return message.__class__(**message_keys)
```

I'm sure there is a neater way of handling the internal attributes e.g. `_serialise_on_wire`.

With the above, the receiver would have the same object as the sender, which is more intuitive.

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

L’issue ne nomme aucun fichier source ni aucun test. Commencez par suivre le chemin de désérialisation Python dans betterproto.Message et examinez la manière dont _get_field_default et les attributs internes sont gérés. Le travail doit être considéré comme terminé lorsque les messages désérialisés conservent les valeurs par défaut explicites de protobuf, tout en préservant le comportement actuel de sérialisation et d’égalité.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
python
Domaine
backend-api-design
Type d'issue
Fonctionnalité
Difficulté
5/5
Temps estimé
Plus d'une semaine
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.