Site optimisé pour... VOUS !!!    —  max_cqft

Discussions

Python : apprentissage, ide, etc

Guybrush 8428 Bob
Reprise automatique du message précédent.
Courage :-D
yaug 1471 Spammeur
Tient, petite question de python.

Je crée ma première API en python (en utilisant fastapi)
Cette api va retourner des résultats renvoyés par une lib.
Mon pb, c'est que le json retourné est un peu dégueu, les clés deviennent des entiers. Je pense que c'est parce que j'ai comme résultat des tuples.
Du coup je cherche à formater mieux mon résultat mais pour cela il faudrait que j'arrive à parcourir la liste des clés d'un tuples. Et... c'est peut être con mais je n'y arrive pas.
Une idée ?

Par exemple j'ai comme résultat :
cbw_object(id=202, hostname='nomdelavm', description=None, last_communication='2023-02-15T07:32:09.194+01:00', reboot_required=False, boot_at='2022-11-17T17:57:09.000+01:00', category='server', created_at='2023-02-14T11:15:41.184+01:00', environment=cbw_object(id=2, name='Medium', confidentiality_requirement='confidentiality_requirement_medium', integrity_requirement='integrity_requirement_medium', availability_requirement='availability_requirement_medium', ceiling_cvss_v3=None), os=cbw_object(key='debian_11_64', name='Debian 11 (Bullseye)', arch='x86_64', eol=None, short_name='Debian 11', type='Os::Debian'), groups=[cbw_object(id=14, name='nomnumero1', description='nomnumero1', color='#989e42'), cbw_object(id=22, name='nomnumero1-dev', description='nomnumero1-dev', color='#85e836')])
Guybrush 8428 Bob
Pour t'aider, il faudra davantage de détails :-) Quelle est la structure initiale, et qu'est-ce qui est utilisé pour générer ton output (on dirait un dump json d'un data model instancié) ? Je n'ai pas l'impression que ce sont des tuples que tu as (ou alors, des namedtuples, peut-être ?).
PetitCalgon 2672 Bob
Si c'est un dictionnaire, tu peux parcourir les clefs avec
for property, value in vars(object).items():

Je fais du Jupyter Notebook actuellement et je définis des objets par exemple:
column = {
"key": key,
"type" : "number",
"precision": 2,
"min": 0
}
Et avec la fonction intégré du Notebook scrapbook.glue(...) ça sérialise parfaitement en Json, parfaitement utilisable comme attendu côté JS.
yaug 1471 Spammeur
Ce que je t'ai copié est le résultat du print(monObjet).

L'objet retourné est créé via ceci (de la lib qui me génère l'objet :
result = json.loads(response.text, object_hook=lambda d: namedtuple('cbw_object', d.keys())(*d.values()))

Il me crée donc un tuple nommé.
Mon problème est donc de réussir à parcourir les champs de ce tuple nommé.


Ce message a été modifié 2 fois. Dernière modification : 15 février 2023 à 12:00 par yaug.

yaug 1471 Spammeur
PetitCalgonutilisable
Mon problème est justement que ce n'est pas un dictionnaire mais un namedtuple. :frightened:
Guybrush 8428 Bob
C'est assez curieux comme construction, car en gros, tu crées un nouveau type (un namedtuple) pour chaque objet que tu rencontres, tu le nommes "cbw_object" (alors que ce sont des objets potentiellement différents à chaque fois) et les "champs" de ce tuple sont définis par la méthode "keys()" de l'objet, donc potentiellement des champs différents à chaque fois. J'ai un doute sur ta façon de procéder, là :-p

Sinon, à priori, tu peux accéder à la liste des champs d'un namedtuple via l'attribut "_fields" (ou tu peux en récupérer un dictionnaire équivalent via "_as_dict()"). Dans les deux cas, l'underscore initial est signe que ce n'est pas forcément une bonne idée que de passer par là (et, cf. premier paragraphe, je ne comprends pas l'intérêt de passer par un nametuple, un dict me semblerait plus judicieux).
yaug 1471 Spammeur
écoute, la partie namedtuple c'est issue de la lib que je suis forcé d'utiliser.
Du coup, je n'ai pas la main dessus.
C'est en cherchant à comprendre ce que je récupérais comme objet en appelant la lib que j'ai vu que c'était ça ... et c'est en cherchant à retourner le résultat de mon appel que j'ai commencé à avoir des soucis.
C'est pour cela que je cherchais à faire une correspondance entre champ et et valeur pour retourner un truc plus propre sur mon API.
Guybrush 8428 Bob
Non mais tu peux sans doute changer le hook (ou même ne pas le spécifier vu que ça semble être des dict) et ça devrait aller mieux :-)
Guybrush 8428 Bob
Ah j'avais mal compris, tu peux pas toucher à ce hook. Donc, en gros, tu reçois quoi exactement comme input ? La liste des namedtuple, c'est ça ? Si oui, regarde avec _as_dict() si ça suffit pas.
yaug 1471 Spammeur
Merci pour le _asdict() au fait.
ça fait le job

Répondre

Vous devez être inscrit et identifié.