danielgtaylor / danielgtaylor/python-betterproto

OneOf Enforcement?

Abierto
#189 3 comentarios 2 reacciones 0 asignados Ver en GitHub
Lenguaje dominante
Python
Estrellas
1.8k
Forks
234
Métricas de merge de PR
Sin PR fusionados en 30 d

Descripción

Thanks for all of your work on betterproto, it's been immensely helpful.

What is betterproto's canonical way of enforcing Protobuf `oneof`s are only set to one variant?

From this demo-protobuf:

```proto
syntax = "proto3";
package demo;

message Thing1 {
string name = 1;
}
message Thing2 {
string name = 1;
}
message Thing3 {
string name = 1;
}
message Thing4 {
string name = 1;
}

message OneThing {
oneof t {
Thing1 t1 = 1;
Thing2 t2 = 2;
Thing3 t3 = 3;
Thing4 t4 = 4;
}
}
```

Creating a `OneThing` appears produce default values of non-used `oneof` variants.

```
In [2]: OneThing(t1=Thing1(name='cy'))
Out[2]: OneThing(t1=Thing1(name='cy'), t2=Thing2(name=''), t3=Thing3(name=''), t4=Thing4(name=''))
```

Moreover it'll initialize more than one of them:

```
In [5]: o = OneThing(t1=Thing1(name='cy'), t2=Thing2(name='huh'))
In [6]: o
Out[6]: OneThing(t1=Thing1(name='cy'), t2=Thing2(name='huh'), t3=Thing3(name=''), t4=Thing4(name=''))
```

And that combination passes a round-trip through serialization and de-serialization:

```
In [7]: OneThing.FromString(bytes(o))
Out[7]: OneThing(t1=Thing1(name=''), t2=Thing2(name='huh'), t3=Thing3(name=''), t4=Thing4(name=''))
```

What's the intent as to where this *should* be enforced? Outside of betterproto?

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza con el protobuf de demostración y los puntos de entrada generados de OneThing mostrados en el informe: construcción, bytes(o) y OneThing.FromString. Reproduce el comportamiento con múltiples variantes y compara el constructor con el recorrido de ida y vuelta de la serialización. Se considera terminado cuando la ubicación canónica del proyecto para la aplicación y el comportamiento esperado de oneof estén claramente decididos y documentados o implementados.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
python
Área
api, backend-api-design
Tipo de issue
Nueva funcionalidad
Dificultad
5/5
Tiempo estimado
Más de una semana
Estado de actividad
Estancado
Claridad
Bastante claro
Aptitud para principiantes
25/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.