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 :

Valeur d'une variable composée


Sujet :

Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 114
    Points : 60
    Points
    60
    Par défaut Valeur d'une variable composée
    Bonjour

    Je cherche à composer le nom d'une variable qui devra ensuite être remplacé par sa valeur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #constante
    CST_0 = [0x01]
    CST_1 = [0x02]
    CST_2 = [0x03]
     
    for i in range(3):
      variable = "CST_"+str(i)
      print variable
    Ceci me retourne le string CST_0, CST_1, CST_2
    Est=il possible d'avoir en retour la valeur de ma constante
    [0x01],[0x02],[0x03]

    Merci

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    En Python les noms de variables sont généralement définies dans le dictionnaire globals() (qui est local au module). Donc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #constante
    CST_0 = [0x01]
    CST_1 = [0x02]
    CST_2 = [0x03]
     
    for i in range(3):
      variable = globals().get("CST_%d" % i)
      print variable
    Mais, en écrivant cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    CST = range(3)
    for i in range(len(CST)):
        print CST[i]
    N'est-il pas plus simple/naturel d'utiliser une liste de valeurs accessibles à travers une variable CST que de créer un paquet de variables suivant un "template" CST_%d qui ne seront que des clés dans une map...

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

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 114
    Points : 60
    Points
    60
    Par défaut
    Merci pour votre réponse dont votre première solution correspond à ma recherche
    La deuxième proposition ne convient pas car le nom composé des variables CST_X données en exemple ne sont pas 0,1,2,3,... mais des valeurs construites dynamiquement pas nécessairement séquentiel

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par FlyByck Voir le message
    Merci pour votre réponse dont votre première solution correspond à ma recherche
    La deuxième proposition ne convient pas car le nom composé des variables CST_X données en exemple ne sont pas 0,1,2,3,... mais des valeurs construites dynamiquement pas nécessairement séquentiel
    Mon propos était d'éviter d'utiliser le dictionnaire "globals()" d'un module!
    Si la structure de liste n'est pas appropriée, créer CST comme dictionnaire permet d'avoir le même type d'accès que dans 'globals':
    De façon condensée:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CST = {}
    CST[0] = 0x01
    CST[1] = 0x02
    CST[2] = 0x03
    for x in range(3):
         print CST.get(x)
    De façon plus lourde:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CST = {}
    CST['CST_%d' % 0] = 0x01
    CST['CST_%d' % 1] = 0x02
    CST['CST_%d' % 2] = 0x03
    for x in range(3):
         print CST.get('CST_%d' % x)
    Notez aussi que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #constante
    CST_0 = [0x01]
    CST_1 = [0x02]
    CST_2 = [0x03]
    associent à CST_x non pas des constantes mais des listes contenant un entier.
    Cordialement,
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2003
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2003
    Messages : 114
    Points : 60
    Points
    60
    Par défaut
    Salut

    Ah! Cela me plait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CST = {}
    CST[0] = 0x01
    CST[1] = 0x02
    CST[2] = 0x03
    for x in range(3):
         print CST.get(x)
    Bien sur #constante est un abus de langage

    Merci

  6. #6
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour,

    Pourquoi get() ?
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12345678910
    >>> CST_0 = [0x01]
    >>> CST_1 = [0x02]
    >>> CST_2 = [0x03]
    >>> for i in range(3):
    ...     variable = globals()["CST_%d" % i]
    ...     print(variable)
    ... 
    [1]
    [2]
    [3]
    (Juste pour l'exemple, l'utilisation de globals()/locals() doit être bien assimilée pour les utiliser)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    12
    >>> type(globals())
    <class 'dict'>
    >>> CST = {} >>> CST[0] = 0x01 >>> CST[1] = 0x02 >>> CST[2] = 0x03 >>> for x in range(3): ... print(CST[x])
    Le get() des dico n'a d’intérêt que dans le cadre dic.get(value, other)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> CST.get(4, None)
    >>> CST.get(4, 5)
    5
    @+
    Merci d'utiliser le forum pour les questions techniques.

  7. #7
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Pourquoi get() ?
    Le get() des dico n'a d’intérêt que dans le cadre dic.get(value, other)
    Ce qui fait préférer un dict à list est qu'ici la "clé" correspondante aux entiers dans 0..N n'est peut être pas définie.

    Du coup, CST[x] levera une exception alors que CST.get(x) retournera un objet: None (par défaut) ou l'int correspondant à la valeur.

    Exception ou None, l'appelant devra le "gérer" dans tous les cas mais à partir du moment ou ça retourne un objet, l'interface sera plus "ouverte".

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

  8. #8
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Bonjour wiztricks,

    Vous avez bien compris le sens de la question, soit 'pourquoi wiztricks a utiliser .get() ici', et merci d'y répondre.

    Dans un premier temps ma vision du get() des dico:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def get(key, default=None):
        if key in dic:
            return dic[key]
        else:
            return default
    De ce fait je me dit que sans default cela donne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    def get(key):
        if key in dic:
            return dic[key]
    Et cela me rappelle:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def get(key):
        try:
            return dic[key]
        except:
            pass
    Du coup, CST[x] levera une exception alors que CST.get(x) retournera un objet: None (par défaut) ou l'int correspondant à la valeur.

    Exception ou None, l'appelant devra le "gérer" dans tous les cas mais à partir du moment ou ça retourne un objet, l'interface sera plus "ouverte".
    CST[x] pouvant être None l'utilisation de dico.get(key) sans utiliser le default pour gérer tout cela me semble l'équivalent de try/pass. ou alors cela implique que le test est sur None.

    Ceci ne rentre pas en compte ici puisque nous somme dans un exemple ou le contenu de CST est connu (d’où le range)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CST = {}
    CST[0] = 0x01
    CST[1] = 0x02
    CST[2] = 0x03
    for x in range(3):
         print CST.get(x)
    Ben oui... J'ai du mal a accepter get(key, default=None) pour les dico en dehors des tests...

    @+
    Merci d'utiliser le forum pour les questions techniques.

  9. #9
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    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 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut PauseKawa,

    Que dit le PO:
    Citation Envoyé par FlyByck
    La deuxième proposition ne convient pas car le nom composé des variables CST_X données en exemple ne sont pas 0,1,2,3,... mais des valeurs construites dynamiquement pas nécessairement séquentiel
    => L'exemple est "trompeur".

    Citation Envoyé par PauseKawa
    CST[x] pouvant être None l'utilisation de dico.get(key) sans utiliser le default pour gérer tout cela me semble l'équivalent de try/pass. ou alors cela implique que le test est sur None.
    Absolument. Et ma proposition est de préférer le retour d'un objet à celui d'une exception.

    Pour ce qui est de l'équivalent à "try/pass"... Je pense qu'il faut différencier
    • l'API proposée à l'appelant: ici .get(ident) retourne None ou l'int associé à ident.
    • la réalisation de cette API


    Ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def get(key):
        try:
            return dic[key]
        except:
            pass
    est une réalisation qui implémente l'API.
    Elle n'est peut être pas très heureuse mais elle fonctionne.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  10. #10
    Expert confirmé Avatar de PauseKawa
    Homme Profil pro
    Technicien Help Desk, maintenance, réseau, système et +
    Inscrit en
    Juin 2006
    Messages
    2 725
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Technicien Help Desk, maintenance, réseau, système et +
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 725
    Points : 4 005
    Points
    4 005
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def get(key):
        try:
            return dic[key]
        except:
            pass
    est une réalisation qui implémente l'API.
    Elle n'est peut être pas très heureuse mais elle fonctionne.
    - W
    J'en suis bien conscient (et complètement contre: Je nomme ceci un cache misère)! Je ne voulais faire paraître que mon impression sur get() sans test.

    Pour moi le get() des dico n'est pas 'neutre' dans son approche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    def get(key, default=None):
        if key in dic:
            return dic[key]
        else:
            return default
    Et demande donc un test
    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
    >>> CST = {}
    >>> CST[0] = 0x01
    >>> CST[1] = 0x02
    >>> CST[2] = 0x03
    >>> for x in range(10):
    ...      print CST.get(x)
    ... 
    1
    2
    3
    None
    None
    None
    None
    None
    None
    None
    >>> for x in range(10):
    ...      result = CST.get(x)
    ...      if result:
    ...          print result
    ... 
    1
    2
    3
    Mais bon, c'est vrais : l'exemple est trompeur.

    Citation Envoyé par wiztricks Voir le message
    Absolument. Et ma proposition est de préférer le retour d'un objet à celui d'une exception.
    La gestion de l'exception possible (avant) n'est elle pas plus simple ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for x in range(3):
        if x in CST:
             print CST[x]
    Bref, je me suis juste retrouvé perplexe pour le get() et je vais arrêter de polluer le post.

    Merci pour les réponses
    Merci d'utiliser le forum pour les questions techniques.

Discussions similaires

  1. [XSL] Comment modifier la valeur d'une variable?
    Par sorcer1 dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 17/02/2010, 13h26
  2. récupération d'une valeur dans une variable
    Par jh0483 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/08/2005, 09h49
  3. Réponses: 2
    Dernier message: 16/08/2005, 09h43
  4. afficher dans une boite de dialogue la valeur d'une variable
    Par micknic dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 10/07/2005, 09h25
  5. Intercepter le changement de valeur d'une variable
    Par Captain_JS dans le forum C++Builder
    Réponses: 5
    Dernier message: 07/01/2005, 08h04

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