danielgtaylor / danielgtaylor/python-betterproto

Dictionary representation improvement?

Ouverte
#252 0 commentaires 5 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

enhancement
Langage dominant
Python
Étoiles
1.8k
Forks
234
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

Is there a better way to represent this dictionary into a Struct()? (Currently using 2.0.0b3)

capability_dict = {"@context": "https://w3id.org/security/v2",
			  "target": "urn:trinsic:wallets:noop",
			  "proof": {
				  "created": datetime.datetime.now()
			  }
			  }

The following does work, but seems pretty kludgy:

proof = Struct()
proof.fields["created"] = Value(string_value=str(datetime.datetime.now()))
capability = Struct()
capability.fields["@context"] = Value(string_value="https://w3id.org/security/v2")
capability.fields["target"] = Value(string_value="urn:trinsic:wallets:noop")
capability.fields["proof"] = Value(struct_value=proof)
  • It seems to me that we could/should at least have a Struct.from_dictionary(obj: dict) method. I'd be happy to write this if it doesn't exist.
  • Struct.from_dict() does NOT work for this, tested.

Example code of what I'm thinking:

def value_to_proto_value(obj: Any) -> Value:
    value = Value()
    if isinstance(obj, str) or isinstance(obj, datetime.datetime):
        value = Value(string_value=str(obj))
    elif isinstance(obj, int) or isinstance(obj, float):
        value = Value(number_value=float(obj))
    elif isinstance(obj, bool):
        value = Value(bool_value=obj)
    elif isinstance(obj, dict):
        value = Value(struct_value=dictionary_to_struct(obj))
    elif isinstance(obj, list):
        value = Value(list_value=list_to_proto_list(obj))

    return value


def list_to_proto_list(obj: List) -> ListValue:
    return ListValue(values=[value_to_proto_value(item) for item in obj])


def dictionary_to_struct(obj: Dict[str, Any]) -> Struct:
    return Struct(fields=dict([(k, value_to_proto_value(v)) for k, v in obj.items()]))

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Commencez par localiser les définitions de Struct, Value et ListValue et examinez pourquoi Struct.from_dict() ne gère pas le dictionnaire imbriqué présenté. Confirmez le comportement de conversion prévu pour les dictionnaires imbriqués, les listes, les chaînes, les nombres, les booléens et les valeurs datetime. Le travail est considéré comme terminé lorsqu’une API ergonomique est définie d’un commun accord et que la représentation d’exemple est couverte.

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

Évaluation

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

Recevez les nouvelles issues par e-mail

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