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 :

switch/case en Python ?


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Paysan
    Inscrit en
    Juin 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2015
    Messages : 45
    Points : 39
    Points
    39
    Par défaut switch/case en Python ?
    Bonjour à toutes et tous, et bonne continuation de cette période de fêtes,

    Je n'ai pas encore exploré toutes les possibilités du python (comme certains savent ;-) ) et je n'ai pas trouvé l'équivalent en python:
    - de l'énumération de cas et match du rust,
    - ou plus simplement le switch/case du C
    - ou le case/val du pascal
    (il s'agit d'exécuter du code pour chaque cas, trouver le nom d'un mois avec son numéro n'a rien de commun, bien sûr ... là je sais faire ;-) ; d'ailleurs un switch/case pour cela n'est pas bien joli "imho" ...)
    Le but est de traiter le retour d'un message à l'utilisateur pour choisir entre différents cas.

    Bien sûr il y a le if/elif/else, mais je suis étonné que la structure algorithmique switch/case n'existe pas; j'ai dû passer à côté ...

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Avec Python tout se ramène a une histoire de dictionnaire ou à l'association entre des valeurs (les clefs) et des messages (ou des actions/fonctions).

    Pour les exemples cherchez sur Internet avec "Python switch/case" vous y trouverez des tas de cas d'utilisations.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Paysan
    Inscrit en
    Juin 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2015
    Messages : 45
    Points : 39
    Points
    39
    Par défaut
    Merci, j'avais pas imaginé qu'on pouvait mettre des fonctions en dictionnaire (ça donne la même idée que le match du rust -me semble-t-il-)

    Est-ce que le code suivant correspond bien à l'idée du dictionnaire ?

    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
        def closeEvent(self, event):
            # provisoire pour test (pas d'évent de retour correct)
            # Python switch/case
            # Dictionnaire de fonctions
            ChoixUsr="Annule" # En réel, demander à l'utilisateur
            for ExecChoix in {
                "FermeSansSauver": FermeSansSauver,
                "SauveEtFerme": SauveEtFerme,
                "Annule": Annule,
                }.ChoixUsr: ExecChoix()
                event.ignore()
            def FermeSansSauver():
                print("Ok, je ferme (sans sauver)")
            def SauveEtFerme():
                print("Ok, je sauve et je ferme")
            def Annule():
                print("Ok, je retourne")

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Paysan
    Inscrit en
    Juin 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2015
    Messages : 45
    Points : 39
    Points
    39
    Par défaut
    Désolé, ne pas regarder mon code précédent; j'ai voulu m'inspirer d'un exemple, et mon code est absurde ...

    j'en suis à, qui fonctionne presque ... :
    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
        def FermeSansSauver(self):
            print("Ok, je ferme (sans sauver)")
        def SauveEtFerme(self):
            print("Ok, je sauve et je ferme")
        def Annule(self):
            print("Ok, je retourne")
        def closeEvent(self, event):
            print("Dans closeEvent")
            # provisoire pour test (pas d'évent de retour correct)
            # Python switch/case
            # Dictionnaire de fonctions
            ChoixUsr="Annule" # En réel, demander à l'utilisateur
            {
            "FermeSansSauver": self.FermeSansSauver,
            "SauveEtFerme": self.SauveEtFerme,
            "Annule": self.Annule,
            }[ChoixUsr]()

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Si vos noms sont associés à des "attributs"/noms de méthodes, les dictionnaires sont déjà là, il suffit d'aller y piocher dedans via getattr:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ChoixUsr="Annule"
    getattr(self, ChoixUsr)()
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Paysan
    Inscrit en
    Juin 2015
    Messages
    45
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Paysan
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Juin 2015
    Messages : 45
    Points : 39
    Points
    39
    Par défaut
    Mon code qui fonctionne, pour le cas ou ce serait intéressant (mais c'est probablement trivial pour qui connaît bien python) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        def closeEvent(self, event):
            print("Dans closeEvent")
            def FermeSansSauver(): print("Ok, je ferme (sans sauver)"); event.accept()
            def SauveEtFerme(): print("Ok, je sauve et je ferme"); self.SaveData(); event.accept()
            def Annule(): print("Ok, je retourne"); event.ignore()
            if self.flagsDataChanged:
                ChoixUsr="Sauve" # En réel, demander à l'utilisateur
                {"Ferme": FermeSansSauver, "Sauve": SauveEtFerme, "Annule": Annule, }[ChoixUsr]()

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Si les "noms" de variables sont dans l'espace "local" de la fonction, le dictionnaire s'appelle alors locals():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    >>> def f(m):
    ...     def g(s):
    ...         print (s)
    ...     def not_found(s):
    ...         print ('not found')
    ...     a = b = c = g
    ...     locals().get(m, not_found)(m)
    ...
    >>> f('a')
    a
    >>> f('e')
    not found
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Language]Probleme de switch case
    Par nana1 dans le forum Langage
    Réponses: 20
    Dernier message: 17/11/2005, 00h49
  2. switch case pour deux variable en meme temps
    Par petitours dans le forum C
    Réponses: 3
    Dernier message: 06/11/2005, 19h20
  3. [Tableaux] Problème avec Switch case
    Par philippef dans le forum Langage
    Réponses: 4
    Dernier message: 07/09/2005, 16h37
  4. probleme gestion condition switch - case
    Par DarkMax dans le forum Langage
    Réponses: 5
    Dernier message: 07/09/2005, 14h25
  5. [Language] aide sur les switch case
    Par pouss dans le forum Langage
    Réponses: 3
    Dernier message: 05/04/2005, 11h34

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