IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Comment "Appeler" une liste grâce à une chaine string sélectionnée ?


Sujet :

Python

  1. #1
    Candidat au Club
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2022
    Messages : 12
    Points : 2
    Points
    2
    Par défaut Comment "Appeler" une liste grâce à une chaine string sélectionnée ?
    Bonjour à toutes et tous,

    Malgré deux journées de recherche intensive et de tentatives de bidouillage, je m'en remets à vos conseils.

    Dans un script me permettant de réaliser des calculs complexes en peu de temps, j'ai créer, dans une class appelée isotop, une listes par isotope radioactif avec à l'intérieur de la liste des valeurs nécessaire à les calculs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
        fluor18=[3.52e18,6588,0,511,0,0,1.94,0,0]
        chlore38=[4.92e18,22320,1.642,2.168,0,0.33,0.44,0]
        scandium46=[1,25e15,7240320,0.889,1.121,0,1,1,0]
        scandium48=[5.53e16,157248,0.984,1.038,1.312,1,0.98,1]
        cobalt60=[4.18e13,166194720,1.173,1.333,0,1,1,0]
        iridium192=[3.41e14,6376320,0.317,0.468,0.604,0.83,0.48,0.08]
        thallium204=[1.71e13,119206080,0.069,0,0,1,0,0]
        cesium137=[3.20e12,949233600,0.032,0.036,0.662,0.06,0.01,0.85]
        iode131=[4.61e15,691200,0.284,0.365,0.637,0.06,0.82,0.07]
        strontium85=[8.75e14,5607360,0.013,0.015,0.514,0.5,0.08,0.99]
        lutetium177m=[1.69e14,13858560,0.328,0.379,0.419,0.18,0.28,0.20]
    Pour sélectionner un isotope, j'ai créé une liste avec le nom des isotopes afin de renseigner une combobox qui me retourne la sélection de l'utilisateur en chaine str.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    isotopes=["fluor18","Chlore38","Scandium46","Scandium48","Cobalt 60","Iridium 192","Thallium 204","Cesium 137","Iode 131","Strontium 85","Lutétium 177m"]
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
        selection_isotope_ded1m = StringVar()
        selection_isotope_ded1m.set("...")
        Combobox(page_ded1m,values=isotop.isotopes,textvariable=selection_isotope_ded1m).grid(row=1,column=0)
    Suite à cette sélection en string, je me tape une multitude de if et elif pour sélectionner les valeurs contenue dans la liste correspondante à l'isotope.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
            if str_selection_isotope_ded1m == isotop.isotopes[0]:
     
                e1=isotop.fluor18[2]
                e2=isotop.fluor18[3]
                e3=isotop.fluor18[4]
                q1=isotop.fluor18[5]
                q2=isotop.fluor18[6]
                q3=isotop.fluor18[7]
                affichage_calcul()
    Afin d'arrêter de coder des elif à chaque fois que je rajoute un isotope, je souhaiterai "appeler directement" le contenu de la liste via la chaine string de la combobox.

    Du style ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
           str_selection_isotope_ded1m
    
                e1=isotop.str_selection_isotope_ded1m[2]
                e2=isotop.str_selection_isotope_ded1m[3]
                e3=isotop.str_selection_isotope_ded1m[4]
                q1=isotop.str_selection_isotope_ded1m[5]
                q2=isotop.str_selection_isotope_ded1m[6]
                q3=isotop.str_selection_isotope_ded1m[7]
                affichage_calcul()
    Bien sûr, le dernier code ne fonctionne pas sinon je ne serai pas là..

    J'ai naturellement essayé de contourner le souci avec index() mais je n'ai pas réussi et surtout je suis persuadé qu'une syntaxe simple doit exister...

    Dans l'espoir d'avoir été clair et que vous ayez une solution à l'optimisation de mon code.

    Je vous remercie.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 11 168
    Points : 27 351
    Points
    27 351
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par judi_cael Voir le message
    ...et surtout je suis persuadé qu'une syntaxe simple doit exister...
    Ben oui, les dictionnaires !!!

    Et les listes figées, ce sont des tuples.

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    fluor18=(3.52e18,6588,0,511,0,0,1.94,0,0)
    chlore38=(4.92e18,22320,1.642,2.168,0,0.33,0.44,0)
    scandium46=(1,25e15,7240320,0.889,1.121,0,1,1,0)
    scandium48=(5.53e16,157248,0.984,1.038,1.312,1,0.98,1)
    cobalt60=(4.18e13,166194720,1.173,1.333,0,1,1,0)
     
    isotopes={
    	"fluor18" : fluor18,
    	"Chlore38" : chlore38,
    	"Scandium46" : scandium36,
    }
     
    for k in isotopes.keys():
    	print(k, isotopes[k])
     
    for v in isotopes.values():
    	print(v)
     
    for (k, v) in isototopes.items():
    	print(k, v)

    Tu peux même éviter les intermédiaires
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    isotopes={
    	"fluor18" : (3.52e18,6588,0,511,0,0,1.94,0,0),
    	"Chlore38" : (4.92e18,22320,1.642,2.168,0,0.33,0.44,0),
    	"Scandium46" : (1,25e15,7240320,0.889,1.121,0,1,1,0),
    }
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Candidat au Club
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2022
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Je te remercie !

    Etant débutant, je ne maitrise pas les dictionnaires mais je vais m'y atteler!!

    Pour le tuples, effectivement je confond souvent entre liste et tuple

    Je te remercie pour ton aide rapide, je vais essayer de l'utiliser à bon escient.

    Cordialement.

    Je posterai ma solution

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 11 168
    Points : 27 351
    Points
    27 351
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par judi_cael Voir le message
    Etant débutant, je ne maitrise pas les dictionnaires
    Tu maitrises les listes? Tu sais balayer une liste? Rechercher un élément par sa position? Alors tu maitrises les dictionnaires. Simplement dans un dictionnaire on n'a pas des "positions" numériques mais des "clefs" qui peuvent être quasiment n'importe quoi.

    Ici un petit tuto explicatif.

    Citation Envoyé par judi_cael Voir le message
    Pour le tuples, effectivement je confond souvent entre liste et tuple
    C'est simple: un tuple c'est une liste non modifiable. Ou une liste c'est un tuple modifiable.
    Donc si tu n'as pas besoin de modifier une liste, un tuple est plus économe en terme de taille et temps d'accès.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    juillet 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Alimentation

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 276
    Points : 5 988
    Points
    5 988
    Par défaut
    Hello,

    j'ai créer, dans une class appelée isotop
    Je ne vois pas de classe !

    Cependant, en admettant qu'elle est réellement implémentée, encore faut-il qu'elle soit justifiée (ce qui est tout à fait imaginable à mon sens) en implémentant les actions liées à un isotope.
    Peut-être cela est déjà imaginée, et non implémentée, mais si ce n'est pas le cas je vois deux solutions...

    La 1ère étant de créer un module de constantes et d'importer ce module afin d'y récupérer les valeurs des isotopes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    import constants
     
    isotop_names = [isotop for isotop in dir(constants) if not isotop.startswith("__")]
     
    print(isotop_names)  # ['cesium137', 'chlore38', 'cobalt60', 'fluor18', 'iode131', 'iridium192', ...]
     
     
    isotop = lambda name: getattr(constants, name, "")
    cesium = isotop("cesium137")
    print(cesium)  # [3200000000000.0, 949233600, 0.032, 0.036, 0.662, 0.06, 0.01, 0.85]
    La 2ème étant de créer un dictionnaire comme l'indique ci-dessous Sve@r

    La pseudo 3ème solution avec une classe isotope

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    from typing import Union
     
    class Isotop:
        def __init__(self, name: str):
            self.__name = name
            self.values: list[Union[int, float]] = []
     
        @property
        def name(self):
            return self.__name
     
        def __str__(self):
            return f"{self.__name}: {self.values}"
     
     
    cesium = Isotop("cesium137")
    cesium.values = [3200000000000.0, 949233600, 0.032, 0.036, 0.662, 0.06, 0.01, 0.85]
     
    print(cesium)  # cesium137: [3200000000000.0, 949233600, 0.032, 0.036, 0.662, 0.06, 0.01, 0.85]
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 11 168
    Points : 27 351
    Points
    27 351
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    La 1ère étant de créer un module de constantes et d'importer ce module afin d'y récupérer les valeurs des isotopes
    ...

    La pseudo 3ème solution avec une classe isotope
    Holà Tornado hooo... as-tu noté l'état de "quasi débutant" de notre nouvel ami???
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    juillet 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Alimentation

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 276
    Points : 5 988
    Points
    5 988
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Holà Tornado hooo... as-tu noté l'état de "quasi débutant" de notre nouvel ami???
    Oui c'est fort possible en effet, j'avoue
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Candidat au Club
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2022
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Merci à vous pour vos conseils et effectivement Fred, tu viens de me satelliser !

    J'ai effectivement besoin de récupérer les valeurs indépendamment pour les appliquer dans une formule et j'ai peur que le dictionnaire ne puisse pas le faire..

    La liste est toute indiquée manifestement mais je vais relire encore une trentaine de fois vos messages :-)

    Sinon la classe était juste une manière de les classer, je n'avais pas déf d'__init__.


    Pour une meilleur lecture, je vous partage le code entier par github.

    https://github.com/MJudicael/EASY-CMIR

    Merci encore !

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 11 168
    Points : 27 351
    Points
    27 351
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par judi_cael Voir le message
    et j'ai peur que le dictionnaire ne puisse pas le faire..
    Bien évidemment que si !!!
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    isotopes={
    	"fluor18" : (3.52e18, 6588, 0, 511, 0, 0, 1.94, 0, 0),
    	"Chlore38" : (4.92e18, 22320, 1.642, 2.168, 0, 0.33, 0.44, 0),
    	"Scandium46" : (1,25e15, 7240320, 0.889, 1.121, 0, 1, 1, 0),
    }
    print(isotopes["Clore38"][3] * 2)		# 2*2.168 = 4.336
    Pour le reste ce n'est qu'une question d'itération, de clef et d'index...

    Citation Envoyé par judi_cael Voir le message
    La liste est toute indiquée manifestement mais je vais relire encore une trentaine de fois vos messages :-)
    A la limite tu t'en fouts, c'est juste un détail (pour le puriste, on n'utilise pas de liste quand un tuple suffit). Tu remarqueras aussi l'aération de mon exemple ci-dessus. Un code bien aéré est immédiatement plus lisible.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Membre éprouvé
    Avatar de Hominidé
    Homme Profil pro
    Paysan à 3 francs six sous
    Inscrit en
    juin 2018
    Messages
    749
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan à 3 francs six sous
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : juin 2018
    Messages : 749
    Points : 1 299
    Points
    1 299
    Billets dans le blog
    3
    Par défaut
    Bonjour,
    Et utiliser une dataclasse?
    pathlib, poetry, importlib_ressources...

  11. #11
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    juillet 2006
    Messages
    3 276
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Alimentation

    Informations forums :
    Inscription : juillet 2006
    Messages : 3 276
    Points : 5 988
    Points
    5 988
    Par défaut
    Citation Envoyé par Hominidé Voir le message
    Bonjour,
    Et utiliser une dataclasse?
    Différence avec la classe ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  12. #12
    Candidat au Club
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2022
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bien évidemment que si !!!
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    isotopes={
    	"fluor18" : (3.52e18, 6588, 0, 511, 0, 0, 1.94, 0, 0),
    	"Chlore38" : (4.92e18, 22320, 1.642, 2.168, 0, 0.33, 0.44, 0),
    	"Scandium46" : (1,25e15, 7240320, 0.889, 1.121, 0, 1, 1, 0),
    }
    print(isotopes["Clore38"][3] * 2)		# 2*2.168 = 4.336
    Pour le reste ce n'est qu'une question d'itération, de clef et d'index...


    A la limite tu t'en fouts, c'est juste un détail (pour le puriste, on n'utilise pas de liste quand un tuple suffit). Tu remarqueras aussi l'aération de mon exemple ci-dessus. Un code bien aéré est immédiatement plus lisible.

    Je vais creuser le sujet des dictionnaires, je suis trop light là.

    Merci pour ton aide !

    Si tu as un moment, jette un œil sur le github, l'avis d'expert est toujours apprécié :-)

  13. #13
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 11 168
    Points : 27 351
    Points
    27 351
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par judi_cael Voir le message
    Si tu as un moment, jette un œil sur le github, l'avis d'expert est toujours apprécié :-)
    Hum... 800 lignes !!!
    Ce que je peux dire après une première lecture: c'est bien fouillis. Un coup c'est du code hors fonction (création de l'IHM, création des composés chimiques) puis ensuite création des fonctions puis appel des fonctions.
    Ton truc ça devient un projet alors code le comme un projet. D'un côté l'IHM, qui sera dédiée à l'affichage et à la saisie des valeurs. Ensuite d'un autre côté les calculs, qui se feront "à part". Eventuellement plus tard tu pourras rajouter de la sauvegarde et restitution. C'est ce qu'on nomme la "programmation MVC (Modèle/Vue/Controleur)".
    Tu isoles les technologies que tu peux tester de façon individuelle.

    Sinon tout ce code basé sur str_isotope_ded1m c'est une horreur. Voici grosso-modo ce que tu as écrit
    Code pythonE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    def affichage():
    	print(e1, e2, e3)
     
    xxx=(1, 2, 3)
    yyy=(4, 5, 6)
     
    data=input("Valeur (xxx, yyy) ?")
    if data == "xxx":
    	e1=xxx[0]
    	e2=xxx[1]
    	e3=xxx[2]
    	affichage()
    elif data == "yyy":
    	e1=yyy[0]
    	e2=yyy[1]
    	e3=yyy[2]
    	affichage()

    ça s'écrit simplement
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def affichage(e):
    	print(e[0], e[1], e[2])
     
    isotopes={
    	"xxx" : (1, 2, 3),
    	"yyy" : (4, 5, 6),
    }
     
    data=input("Valeur (%s) ?" % ", ".join(isotopes.keys()))
    affichage(isotopes[data])

    Ca sert à ça les paramètres de fonctions: pouvoir paramétrer leur travail. On évite de passer par des variables globales, bref on évite plein de soucis et surtout on simplifie le code donc sa compréhension.
    Ne pas oublier la philosophie Python: la simplicité est préférable à la complexité
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  14. #14
    Candidat au Club
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2022
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Hum... 800 lignes !!!
    Ce que je peux dire après une première lecture: c'est bien fouillis. Un coup c'est du code hors fonction (création de l'IHM, création des composés chimiques) puis ensuite création des fonctions puis appel des fonctions.
    Ton truc ça devient un projet alors code le comme un projet. D'un côté l'IHM, qui sera dédiée à l'affichage et à la saisie des valeurs. Ensuite d'un autre côté les calculs, qui se feront "à part". Eventuellement plus tard tu pourras rajouter de la sauvegarde et restitution. C'est ce qu'on nomme la "programmation MVC (Modèle/Vue/Controleur)".
    Tu isoles les technologies que tu peux tester de façon individuelle.

    Sinon tout ce code basé sur str_isotope_ded1m c'est une horreur. Voici grosso-modo ce que tu as écrit
    Code pythonE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    def affichage():
    	print(e1, e2, e3)
     
    xxx=(1, 2, 3)
    yyy=(4, 5, 6)
     
    data=input("Valeur (xxx, yyy) ?")
    if data == "xxx":
    	e1=xxx[0]
    	e2=xxx[1]
    	e3=xxx[2]
    	affichage()
    elif data == "yyy":
    	e1=yyy[0]
    	e2=yyy[1]
    	e3=yyy[2]
    	affichage()

    ça s'écrit simplement
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def affichage(e):
    	print(e[0], e[1], e[2])
     
    isotopes={
    	"xxx" : (1, 2, 3),
    	"yyy" : (4, 5, 6),
    }
     
    data=input("Valeur (%s) ?" % ", ".join(isotopes.keys()))
    affichage(isotopes[data])

    Ca sert à ça les paramètres de fonctions: pouvoir paramétrer leur travail. On évite de passer par des variables globales, bref on évite plein de soucis et surtout on simplifie le code donc sa compréhension.
    Ne pas oublier la philosophie Python: la simplicité est préférable à la complexité

    Je te remercie beaucoup.

    Je prends en compte tes remarques et je vais optimiser ce projet. Ce script est écrit avec mes faibles connaissances en codage.
    l'objectif était le fonctionnement. Grâce à toi, je vais pouvoir optimiser.

    Bien cordialement.

  15. #15
    Candidat au Club
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2022
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Hum... 800 lignes !!!
    Ce que je peux dire après une première lecture: c'est bien fouillis. Un coup c'est du code hors fonction (création de l'IHM, création des composés chimiques) puis ensuite création des fonctions puis appel des fonctions.
    Ton truc ça devient un projet alors code le comme un projet. D'un côté l'IHM, qui sera dédiée à l'affichage et à la saisie des valeurs. Ensuite d'un autre côté les calculs, qui se feront "à part". Eventuellement plus tard tu pourras rajouter de la sauvegarde et restitution. C'est ce qu'on nomme la "programmation MVC (Modèle/Vue/Controleur)".
    Tu isoles les technologies que tu peux tester de façon individuelle.

    Sinon tout ce code basé sur str_isotope_ded1m c'est une horreur. Voici grosso-modo ce que tu as écrit
    Code pythonE : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    def affichage():
    	print(e1, e2, e3)
     
    xxx=(1, 2, 3)
    yyy=(4, 5, 6)
     
    data=input("Valeur (xxx, yyy) ?")
    if data == "xxx":
    	e1=xxx[0]
    	e2=xxx[1]
    	e3=xxx[2]
    	affichage()
    elif data == "yyy":
    	e1=yyy[0]
    	e2=yyy[1]
    	e3=yyy[2]
    	affichage()

    ça s'écrit simplement
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def affichage(e):
    	print(e[0], e[1], e[2])
     
    isotopes={
    	"xxx" : (1, 2, 3),
    	"yyy" : (4, 5, 6),
    }
     
    data=input("Valeur (%s) ?" % ", ".join(isotopes.keys()))
    affichage(isotopes[data])

    Ca sert à ça les paramètres de fonctions: pouvoir paramétrer leur travail. On évite de passer par des variables globales, bref on évite plein de soucis et surtout on simplifie le code donc sa compréhension.
    Ne pas oublier la philosophie Python: la simplicité est préférable à la complexité
    Prenant en compte tes conseils, je commence à structurer le projet pour obtenir un bonne visibilité avant d'optimiser le code (car même horrible il fonctionne... ).

    Pour cela, j'ai découpé le script en plusieurs et je les import avec une fonction liée à un Button.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def ded_1m():
        import sample.ded1m
    Lancé depuis le main.py cela me crée des erreurs. Alors que lancé seul, le script ded1m.py fonctionne correctement.

    J'ai essayé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def ded_1m():
        from sample.ded1m import *
    Mais cela donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SyntaxError: import * only allowed at module level

    Comment puis-je importer le "module" sample.ded1m.py situé dans le dossier sample sans générer des erreurs comme si il était ouvert seul ?


    Merci encore pour votre aide !

  16. #16
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 11 168
    Points : 27 351
    Points
    27 351
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par judi_cael Voir le message
    Pour cela, j'ai découpé le script en plusieurs et je les import avec une fonction liée à un Button.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    def ded_1m():
        import sample.ded1m
    Lancé depuis le main.py cela me crée des erreurs. Alors que lancé seul, le script ded1m.py fonctionne correctement.
    Bon déjà l'import ça se fait une fois une seule. C'est (analogie très simplifiée) une espèce de "copier/coller" du code importé. Là tu importes le script à chaque appel de ta fonction.

    Ensuite, au vu de ta syntaxe et de tes explications (script que tu indiques comme étant nommé "ded1m.py" et non pas "sample.py") cela signifie que le script "ded1m.py" se trouve dans un dossier nommé "sample". Est-ce le cas? Parce que import truc.chose peut se lire de deux façons
    • j'importe une fonction def chose() se trouvant dans le script "truc.py"
    • j'importe le script "chose.py" se trouvant dans le dossier "truc"


    Et enfin (et c'est là le point le plus chaud), le chemin du script importé se fait par rapport à la position du programme exécuté. Si tu as par exemple une arborescence
    - toto/main.py
    - sample/ded1m.py
    Ca ne fonctionnera pas car quand le programme est exécuté, tu te trouves alors dans le dossier "toto" et le dossier "toto" ne possède pas de sous-dossier "sample".
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  17. #17
    Candidat au Club
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2022
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Bon déjà l'import ça se fait une fois une seule. C'est (analogie très simplifiée) une espèce de "copier/coller" du code importé. Là tu importes le script à chaque appel de ta fonction.

    Ensuite, au vu de ta syntaxe et de tes explications (script que tu indiques comme étant nommé "ded1m.py" et non pas "sample.py") cela signifie que le script "ded1m.py" se trouve dans un dossier nommé "sample". Est-ce le cas? Parce que import truc.chose peut se lire de deux façons
    • j'importe une fonction def chose() se trouvant dans le script "truc.py"
    • j'importe le script "chose.py" se trouvant dans le dossier "truc"


    Et enfin (et c'est là le point le plus chaud), le chemin du script importé se fait par rapport à la position du programme exécuté. Si tu as par exemple une arborescence
    - toto/main.py
    - sample/ded1m.py
    Ca ne fonctionnera pas car quand le programme est exécuté, tu te trouves alors dans le dossier "toto" et le dossier "toto" ne possède pas de sous-dossier "sample".


    Ensuite, au vu de ta syntaxe et de tes explications (script que tu indiques comme étant nommé "ded1m.py" et non pas "sample.py") cela signifie que le script "ded1m.py" se trouve dans un dossier nommé "sample". Est-ce le cas?
    Oui c'est le cas il est dans un dossier nommé sample et le main.py est à la racine du projet.
    j'importe le script "chose.py" se trouvant dans le dossier "truc"
    Donc je veux importer le script ded1m.py qui se trouve dans le dossier sample.

    Et enfin (et c'est là le point le plus chaud), le chemin du script importé se fait par rapport à la position du programme exécuté. Si tu as par exemple une arborescence
    Le main est à la racine du projet.
    Dossier "principal" :
    Nom : 1.JPG
Affichages : 35
Taille : 15,8 Ko
    Dossier "sample" :
    Nom : 2.JPG
Affichages : 35
Taille : 17,8 Ko

    Merci pour ton aide, je travaille en parallèle de tes conseils avec https://python-guide-pt-br.readthedocs.io/ pour respecter une norme de structure.

  18. #18
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 11 168
    Points : 27 351
    Points
    27 351
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par judi_cael Voir le message
    Donc je veux importer le script ded1m.py qui se trouve dans le dossier sample.
    Ok, donc test unitaire: tu crées un script nommé "truc.py" qui contient ceci
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import sample.ded1m
    print(une_fonction_se_trouvant_dans_le_script_ded1m_pour_voir_si_elle_est_correctement_appelée())
    Et tu l'exécutes. S'il s'exécute sans souci, c'est que l'import fonctionne.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  19. #19
    Candidat au Club
    Homme Profil pro
    Cadre en FPT
    Inscrit en
    octobre 2022
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Cadre en FPT
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : octobre 2022
    Messages : 12
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ok, donc test unitaire: tu crées un script nommé "truc.py" qui contient ceci
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    import sample.ded1m
    print(une_fonction_se_trouvant_dans_le_script_ded1m_pour_voir_si_elle_est_correctement_appelée())
    Et tu l'exécutes. S'il s'exécute sans souci, c'est que l'import fonctionne.
    Oui, cela fonctionne.. et cela m'a fait beaucoup cogiter...

    Aussi, après de multiples essais... Eureka !! Lors de mes "import" ce qui me générait des erreurs était le "mainloop()" à la fin de mes scripts.
    Ce dernier les faisait fonctionner seul mais provoquait de erreurs lorsqu'ils étaient appelés par le main.py.
    Le seul souci c'est que le script se lance au lancement du main. (Je dois la fermer) mais lorsque j'active le Button (Tkinter) le script se lance correctement.
    Il ne me reste plus qu'à trouver comment ne pas lancer automatiquement le script au démarrage du main mais je progresse à grands pas.

    Je vais continuer à structurer mon code et je l'optimiserai par la suite.

    Merci beaucoup pour ton aide Sve@r

  20. #20
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    11 168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : février 2006
    Messages : 11 168
    Points : 27 351
    Points
    27 351
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par judi_cael Voir le message
    Aussi, après de multiples essais... Eureka !! Lors de mes "import" ce qui me générait des erreurs était le "mainloop()" à la fin de mes scripts.
    Tous tes scripts ont un mainloop()? Evidemment ça ne peut pas marcher, le mainloop() devant être unique. Et chaque import évidemment appelle chaque mainloop()
    Mais les concepteurs de Python ont aussi prévu ce souci en rendant un script à la fois autonome et à la fois importable: suffit de mettre la partie autonome dans un if __name__ == "__main__".

    Exemple: je veux faire un script "xxx.py" qui fasse un calcul de factorielle, mais que ce script soit aussi importable ailleurs
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    def fact(n):
    	res=1
    	while n > 1:
    		res*=n
    		n-=1
    	return res
    # fact()
     
    if __name__ == "__main__":
    	# Test
    	for i in range(10): print(i, fact(i))
    # if

    Lorsqu'il est exécuté, sa variable __name__ vaut la string "__main__" et le code du "if" est exécuté et ça affiche les factorielles de 0 à 9. Mais quand il est importé (ex import xxx), la variable __main__ vaut autre chose (le nom de l'import en fait) et la partie dite "autonome" (ici la boucle de tests) ne se fait pas. Mais la fonction, elle, est utilisable par celui qui a importé le script.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/03/2020, 12h37
  2. [PowerShell] comment faire appelle a une Fonction Powershel
    Par Boubou2020 dans le forum Scripts/Batch
    Réponses: 9
    Dernier message: 19/03/2018, 11h33
  3. comment faire appel d'une application java dans un script shell?
    Par moradbe dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 01/02/2007, 20h55
  4. Réponses: 2
    Dernier message: 13/10/2005, 18h46
  5. Réponses: 2
    Dernier message: 06/12/2002, 08h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo