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 :

Equivalence "switch case" : besoin avis pour faire le tri. [Python 3.X]


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Par défaut Equivalence "switch case" : besoin avis pour faire le tri.
    Bonjour à tous,


    J'ai actuellement un "formulaire" de gestion des paramètres d'affichage de courbes. Je souhaite contrôler les valeur entrées par l'utilisateur et vu le nombre de paramètres je comptais créer une fonction dédiée qui sélectionne la vérification à effectuer suivant le nom du paramètre concerné.

    Nom : ADAotp_param.JPG
Affichages : 574
Taille : 70,0 Ko


    Ex : ymin et ymax doivent être des int ; color doit appartenir à la liste des couleur ; line_style doit appartenir à la liste des style de ligne etc... etc..

    Je m’apprêtais donc à construire quelques chose du genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select case:
        case "ymin":
        ....
        case "ymax":
        ....
        case "color":
        ....
    Mais je n'ai rien trouvé de ce genre.
    J'ai à plusieurs reprises trouvé (sur internet) une solution à base de dictionnaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    choices = {'a': 1, 'b': 2}
    result = choices.get(key, 'default')
    qui semble simple et élégante, mais je n'ai pas réussi à créer une fonction qui intègre ce principe.
    Je voulais passer le nom du paramètre en clé et la valeur à contrôler. L'idée étant que le nom appel la fonction interne associée.
    J'ai fais ce bout de code histoire de comprendre le fonctionnement, et ça semblait pouvoir fonctionner, sauf que ça exécute toutes les fonctions à suivre
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    """
    """
    import pdb
     
    def switch_cases(name, value):
    	"""
            Check data conformity
            """
    	def ymin(value):
    		try:
    			value = int(value)
    			print (value)
    		except Exception as e:
    			raise e
     
    	def ymax(value):
    		try:
    			value = int(value)
    			print (value)
    		except Exception as e:
    			raise e
     
     
    	choices = {'ymin' : ymin(value), 'ymax' : ymax(value)}
     
    	result = choices.get(name, 'default')
    	print(result)
     
     
    pdb.set_trace()
     
    # Test avec ymin et 10
    switch_cases('ymin', 10)

    Vos conseils sont les bienvenus sur la solution à base de dictionnaire ou sur la validation de données au sens large...

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    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 741
    Par défaut
    Salut,

    Citation Envoyé par scarou Voir le message
    Vos conseils sont les bienvenus sur la solution à base de dictionnaire ou sur la validation de données au sens large...
    Votre dictionnaire doit avoir la fonction à appeler comme valeur et non son résultat.
    Si vous écrivez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> def foo(s): print(s)
    ...
    >>> s = 'abc'
    >>> d = { 'foo': foo(s) }
    abc
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> d = { 'foo': foo }
    >>> d.get('foo')('xyz')
    xyz
    >>>
    çà ne va pas marcher.

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

  3. #3
    Membre averti
    Homme Profil pro
    Architecte réseau
    Inscrit en
    Janvier 2016
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Architecte réseau

    Informations forums :
    Inscription : Janvier 2016
    Messages : 36
    Par défaut
    Merci

    J'ai malgré tout galéré comme un âne... je comprenais le principe mais impossible de corriger mon code pour que ça marche... J'ai donc repris à 0 et je suis enfin parvenu à quelques chose de correcte...

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    import matplotlib
     
    def value_compliance_check(name, value):
        """
        Return a boolean for the compliance of "value" to the specified rule "name"
        """
        def ymin(value):
            """ ymin have to be an integer"""
            try:
                value = int(value)
                return True
            except:
                print(f'Sorry, {value} is not an integer.')
                return False
     
        def ymax(value):
            """ ymax have to be an integer"""
            try:
                value = int(value)
                return True
            except:
                print(f'Sorry, {value} is not an integer.')
                return False
     
        def color(value):
            """ color have to be a Matplotlib compatible value"""
            available_colors = []
            colors = dict(matplotlib.colors.BASE_COLORS, **matplotlib.colors.CSS4_COLORS)
     
            for color_name, color_value in colors.items():
                available_colors.append(color_name)
                available_colors.append(color_value)
     
            if value in available_colors:
                return True
            else:
                print(f'Sorry, {value} is not an available color.')
                return False
     
        def marker(value):
            """ marker have to be a Matplotlib compatible value"""
            marker_list = ['.', ',', 'o', 'v', '^', '<', '>',
            '1', '2', '3', '4', 's', 'p', '*', 'h', 'H', '+',
            'x', 'D', 'd', '|', '_']
     
            if value in marker_list:
                return True
            else:
                print(f'Sorry, {value} is not an available marker.')
                return False
     
        def line_style(value):
            """ line_style have to be a Matplotlib compatible value"""
            line_style_list = ['-', '--', '-.', ':']
     
            if value in line_style_list:
                return True
            else:
                print(f'Sorry, {value} is not an available line style.')
                return False
     
        def line_size(value):
            """ line_size have to be a float"""
            try:
                value = float(value)
                return True
            except:
                print(f'Sorry, {value} is not a float.')
                return False
     
        def marker_size(value):
            """ marker_size have to be a float"""
            try:
                value = float(value)
                return True
            except:
                print(f'Sorry, {value} is not a float.')
                return False
     
        def graph_number(value):
            """ graph_number have to be an integer"""
            try:
                value = int(value)
                return True
            except:
                print(f'Sorry, {value} is not an integer.')
                return False
     
        rules_dictionnary = {
        'ymin':ymin,
        'ymax':ymax,
        'color':color,
        'marker':marker,
        'line_style':line_style,
        'line_size':line_size,
        'marker_size':marker_size,
        'graph_number':graph_number
        }
     
        return rules_dictionnary.get(name)(value)
     
      # --- testing ---
    print(value_compliance_check('ymin', '10'))
    print(value_compliance_check('ymin', '10f'))
     
    print(value_compliance_check('ymax', '10'))
    print(value_compliance_check('ymax', '-10'))
    print(value_compliance_check('ymax', '10f'))
     
    print(value_compliance_check('color', 'r'))
    print(value_compliance_check('color', 'red'))
    print(value_compliance_check('color', '#EE82EE'))
    print(value_compliance_check('color', (1,1,1)))
    print(value_compliance_check('color', '100'))
     
    print(value_compliance_check('line_style', '-'))
    print(value_compliance_check('line_style', '-.'))
    print(value_compliance_check('line_style', '...'))
     
    print(value_compliance_check('marker', 'o'))
    print(value_compliance_check('marker', 'v'))
    print(value_compliance_check('marker', '|'))
    print(value_compliance_check('marker', 'X'))
     
    print(value_compliance_check('line_size', '1.5'))
    print(value_compliance_check('line_size', '1,5'))
    print(value_compliance_check('marker_size', '1.2'))
    print(value_compliance_check('marker_size', '1,2'))
    print(value_compliance_check('graph_number', '-1'))

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

Discussions similaires

  1. Besoin avis pour utiliser assembleur sur C
    Par kripteks dans le forum x86 32-bits / 64-bits
    Réponses: 2
    Dernier message: 17/10/2014, 13h24
  2. Encadrer une case d'un tableau pour faire l'effet "cellule active" d'un tableur
    Par PONFIA dans le forum Tableaux - Graphiques - Images - Flottants
    Réponses: 1
    Dernier message: 29/04/2014, 09h17
  3. Besoin avis pour dev avec TServerSocket (avec ou sans thread)
    Par Invité dans le forum Web & réseau
    Réponses: 15
    Dernier message: 04/07/2011, 10h45
  4. [Mail] A votre avis pour faire un site de camping..
    Par pierre987321 dans le forum Langage
    Réponses: 5
    Dernier message: 04/05/2007, 15h40

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