Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

Shorter optional fields

Aperta
#499 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
5/5
Tempo stimato
Più di una settimana
Idoneità per principianti
30/100
Tipo di issue
Funzionalità
Chiarezza
Abbastanza chiara
Stato di attività
Ferma
Stack tecnologico
python
Ambito
tooling

Direzione di ricerca

Inizia tracciando il percorso del generatore che produce campi Python per i campi opzionali di proto3; l’issue non indica file o test del repository. Esamina l’esempio referenziato cattrs/converters.py e confronta Ideas A, B e C prima di scegliere un approccio. Il lavoro è completato quando i campi opzionali generano codice più breve, preservando al contempo la tipizzazione corretta con Optional e il rilevamento della presenza.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

enhancement medium

Optional fields generate very long and repetitive code.

The idea is to use shorter and simpler code, and internally consider it as a field having optional=True, group=f"_{field_name}".

Related to #459.

Proto file
syntax = "proto3";

message Foo {
    optional uint32 bar = 1;
};
Currently generated code
from dataclasses import dataclass

import betterproto

@dataclass(eq=False, repr=False)
class Foo(betterproto.Message):
    bar: Optional[int] = betterproto.uint32_field(
        1, optional=True, group="_bar"
    )
Idea A

Read the type-hint of the field, and if it's a union of a type with None, consider it an optional field.

This might be a bad idea if unions of a type + None are used for something other than optional fields.

An example implementation of detecting optional fields can be found here: cattrs/converters.py.

from dataclasses import dataclass
from typing import Union, Optional

import betterproto

@dataclass(eq=False, repr=False)
class Foo(betterproto.Message):
    bar: Optional[int] = betterproto.uint32_field(1)
Idea B

Use a custom type-hint that indicates a field is optional, and is correctly understood by type-checkers as Optional.

from dataclasses import dataclass

import betterproto

@dataclass(eq=False, repr=False)
class Foo(betterproto.Message):
    bar: betterproto.OptionalField[int] = betterproto.uint32_field(1)

It could possibly be implemented something like this:
Annotated

from typing import Optional, TypeVar
from typing_extensions import Annotated

T = TypeVar("T")

optional_metadata = object()  # or another sentinel

OptionalField = Annotated[Optional[T], optional_metadata]
Idea C

Automatically add group=f"_{field_name}" if optional=True and no group specified.

from dataclasses import dataclass

import betterproto


@dataclass(eq=False, repr=False)
class Foo(betterproto.Message):
    bar: Optional[int] = betterproto.uint32_field(1, optional=True)
Lingua principale
Python
Stelle
1.8k
Fork
235
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di danielgtaylor/python-betterproto

Tutte le issue di danielgtaylor/python-betterproto

Issue simili

Altre issue su Python

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.