Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Mais aussi sur les technos front comme React, Angular, Typescript et Javascript en général.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

obtenir une string correspondant au nom d une variable

0 votes

Je bidouille un "jeu" de chimie.
Graphiquement avec PIL je génère des cartes representant differentes caracteristiques des molecules.

liste_synthese = [Aspirin,Paracetamol,Banana_aroma,Olive_soap]

substances_list = [_4_Aminophenol,Aspirin,Banana_aroma,Caustic_soda,Ethanoic_Acid,Ethanoic_Anhydride,Glycerol,Isoamyl_Alcohol,Oleine,Olive_soap,Paracetamol,Salicylic_Acid,Water]

Prenons une molecule en particulier:

Banana_aroma = {"fn":"ester","notabene":"Isoamyl_Acetat","UICPA":"3-Methylbutyl acetate","NFPA":{"flam":3,"health":1,"instab":0,"spec":None}}

Mon probleme, c'est pour nommer automatiquement le fichier quand je sauvegarde en fin de generation.
Ainsi, pour obtenir la carte Banana_aroma.jpeg grace a une boucle qui va parser substances_list.
La possibilite facile mais chiante, c'est d' ajouter une clef "name" et d'y mettre la valeur "banana aroma".
C'est redondant, ça force a taper plus d'info quand on nourrit la "base de donnee".

Ma question ;
comment obtenir la string pour chaque element de ma substances_list ?

Un exemple de là où je bloque dans ma fonction de generation graphique de cartes:

def make_card(name_substance):
    draw = ImageDraw.Draw(new_im)
    draw.text((20, 10),"Nom commun ex: Octane",(0,0,255),font=font)

    draw2 = ImageDraw.Draw(new_im)
    draw2.text((5, 50),"Formule CwHxOyNz",(255,0,0),font=fontRigolo)

    draw3 = ImageDraw.Draw(new_im)
    draw3.text((30, 100),"famille ex: Alcane",(0,255,0),font=fontB)


    new_im.save(name_substance, "JPEG")

for substance in substances_list:
    make_card(name_substance=substance)

Y a pas de methode magique de type name a exploiter ici ;
une idee d' astuce tordue pas terrible serait de sérialiser puis de revenir en arrière avec ast ?

demandé 21-Oct par buffalo974 (2,516 points)
edité 21-Oct par buffalo974

1 Réponse

+3 votes
 
Meilleure réponse

Si je comprend bien, le problème se résous ainsi :

# j'ai une variable avec un certain nom, qui référencie un objet unique en mémoire
a = {}

# je peux récupérer son nom ainsi:
print(set(varname for varname, varval in globals().items() if varval is a))

Ici, on obtient l'ensemble des identifiants qui lient vers l'objet pointé par a. Donc, entre autre, 'a'.


Maintenant, je ne suis pas tellement convaincu par ton besoin.

La possibilite facile mais chiante, c'est d' ajouter une clef "name" et d'y mettre la valeur "banana aroma".
C'est redondant, ça force a taper plus d'info quand on nourrit la "base de donnee".

Et pourtant, ce serais la solution standard, propre, efficace, compréhensible, maintenable, robuste et extensible.

Et si c'est chiant parce qu'il faut taper plus, c'est que ce n'est pas assez automatisé. Ou le format choisi est trop verbeux par rapport aux données.

L'autre truc qui me chiffonne, c'est que, si tu n'a pas de champs name dans ta base de données, par quelle magie peux-tu déterminer le nom de ta molécule ?
À la volée, je pense à deux solutions :

  1. est assumé que la première ligne, c'est telle molécule, que la seconde c'est telle autre, etc.
  2. est inscrit en dur dans le fichier la ligne Banana_aroma = {"fn":"ester","notabene":"Isoamyl_Acetat","UICPA":"3-Methylbutyl acetate","NFPA":{"flam":3,"health":1,"instab":0,"spec":None}}

Dans les deux cas, ça pue.

Dans le premier, ça veut dire que c'est juste un cauchemar à maintenir, ET qu'une partie de ta base de données (les identifiants) est dans ton fichier python.
Et je doute sérieusement que tu ai réellement besoin de splitter ta base de données en sous-ensembles fortement couplés.

Dans le second, ta base de données est soit un script python qui charge l'espace global avec des variables, soit un fichier non-standard que tu parse, de fait, à la main.

Pourquoi pas un fichier JSON ? Ou juste un dictionnaire ?
La clef, c'est le nom, et la valeur c'est le dico qui contient les autres données.

Ou même juste un fichier CSV ? Il ne faudrait taper les noms qu'une fois !


Le fond du problème, selon moi, est que tu mélange les données et le code. Et c'est très probablement une mauvaise idée.

Le nom des molécules, ce sont des données, certainement pas du code. Ça n'a donc rien à faire comme identifiant de variable.

Tu te fiche de manipuler telle ou telle molécule. Tu manipule une molécule, au sens général du terme, et des algos viendront exploiter ses particularités pour décider de comment la dessiner ou la représenter.

répondu 22-Oct par lucas (2,206 points)
sélectionné 1-Nov par buffalo974
...