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 :

variable dans variable


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 4
    Par défaut variable dans variable
    Bonjour,

    Je cherche depuis un moment mais je ne trouve pas la solution à mon problème. Comme du code peut être plus explicite que des grands discours. Voici ce que je souhaite faire

    J'ai le code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    PORT="48"
    CMD="dipslay "+PORT+""
    print(CMD)
    cela m'affiche bien display 48 comme je le souhaite. Maintenant j'ai mis dipslay "+PORT+" dans un fichier texte command.txt
    et quand je veux faire le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    f = open("command.txt", "r") 
    CMD=f.readline()
    print(CMD)
    cela m'affiche display "+PORT+" et non comme je le souhaiterai display 48


    comment peut on faire pour que python interprète cette variable PORT ?

    Merci de votre réponse.

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur calcul scientifique
    Inscrit en
    Mars 2013
    Messages
    1 229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur calcul scientifique

    Informations forums :
    Inscription : Mars 2013
    Messages : 1 229
    Par défaut
    Ton fichier contient

    C'est bien ça ?
    Donc quand tu l'ouvres tu captures la chaine de caractère correspondant aux lignes de ton fichier. Ainsi dans ta lecture de fichier CMD est égale à "display "+PORT+" "

    Quand tu lis un fichier rien n'indique à ton code que telle où telle chaine de caractère doit être interprétée comme une variable, et par la suite remplacée par sa valeur ...

    Donc, soit tu écris directement display 48 dans ton fichier (valeur du CMD dans ton 1er bout de code), soit tu dois à postériori chercher dans la chaine de caractère résultante de ta lecture de fichier, toutes les sous-chaines "+PORT+" pour les remplacer par la valeur que tu veux.

    D'ailleurs c'est bizarre d'écrire "+PORT+" (avec les guillemets inclus) dans le fichier. On pourrait écrire :
    - juste PORT si on n'est sûr qu'il n'y a pas d'autres mots qui pourraient être interprété à tord (exemple si le fichier contient le mot PORTABLE, faut-il remplacé PORT ici ?)
    - ou bien le préfixer d'un symbole caractéristique qui voudra dire "ce qui suit est une variable" à la manière d'un script bash par exemple. En symbole caractéristique tu peux prendre le $ ou @ par exemple, ce qui donnerait dans ton fichier display $PORT ou display @PORT

    EDIT : Une autre possibilité à laquelle je viens de penser, serait de passer par la fonction eval. Il s'agirait là plutot d'écrire dans ton fichier :
    et ensuite de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    PORT=48
    with open("command.txt", "r") as f : CMD=f.readline()
    print(CMD)          ### Là j'ai la même chaine de caractère que dans le fichier
    print(eval(CMD))  ### Là j'ai considéré la chaine de caractère comme un bout de code que j'ai évalué

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

    Citation Envoyé par ramout Voir le message
    comment peut on faire pour que python interprète cette variable PORT ?
    Pour demander à Python d'interpréter une chaîne de caractères comme instruction, on peut utiliser les fonctions eval et exec...
    Mais si vous ne les connaissez pas déjà, plutôt que d'essayer de les utiliser, il serait préférable d'expliquer le problème que vous cherchez en résoudre: avec Python, il est rare d'en avoir besoin sauf quand on ne sait pas utiliser les fonctionnalités du langage.

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

  4. #4
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    En général on utilise un caractère de remplacement, moins dangereux que eval.

    exemple
    cmd.txt
    ensuite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    >>> port = "48"
    >>> with open("cmd.txt", "r") as inf:
    ...     line = inf.readline()
    ... 
    >>> line = line.strip().replace("$", port)
    >>> line
    'display 48'

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 4
    Par défaut
    Parfait !!

    Merci à tous

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Novembre 2017
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Loire (Auvergne)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Novembre 2017
    Messages : 4
    Par défaut
    Je suis en apprentissage de python et j'essaye de faire du code le plus "élégant" possible
    Je reviens sur ma question. J'ai tout ce qu'il me faut. Je suis partie sur le principe de mettre des $ devant mes variables dans mon fichiers. Dans ce fichier, j'ai des variables qui peuvent être n'importe où et parfois il peut en avoir plusieurs par ligne.
    Ces variables correspondes à des attributs d'objet

    Du coup j'ai écris le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    with open(file , 'r') as mon_fichier:
                for  command in  mon_fichier:
                    detail_command = command.split()
     
     
                    for i, elt in  enumerate(detail_command):
                        if re.match(r"^\$", elt):
                            variable = "self."+elt[1:]+""
                            detail_command[i] = eval(variable)
     
     
                    command = " ".join(detail_command)
                    print(command)
    cela fonctionne très bien mais je voulais savoir s' il existait un moyen plus "élégant" de faire cela ?

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 : 12 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par ramout Voir le message
    Je suis en apprentissage de python et j'essaye de faire du code le plus "élégant" possible
    Ca c'est très bien
    Citation Envoyé par ramout Voir le message
    Ces variables correspondes à des attributs d'objet
    cela fonctionne très bien mais je voulais savoir s' il existait un moyen plus "élégant" de faire cela ?
    Si j'ai bien compris, tu as par exemple un objet "toto" qui a un attribut "nom"
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class toto:
        def __init__(self, n):
            self.nom=n
    # class toto
    a=toto("Paul")
    print(a.nom)
    Et tu as dans ton fichier une ligne style "...$nom...".
    Bon, utiliser eval peut être dangereux. Imagine que dans le fichier quelqu'un écrive system("del c:\*.* /r) j'espère que tu vois où je veux en venir. Mais bon, eval existe donc ça veut dire que dans certains cas il peut être nécessaire donc on ne peut pas dire que ce soit "inélégant" de l'employer.

    Mais on peut aussi faire autrement. Imaginons que ton objet ne possède pas un attribut "nom" mais un dictionnaire.
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class toto:
        def __init__(self, n):
            self.data={
                "nom" : n,
           }
        # __init__()
    # class toto
    a=toto("Paul")
    print(a.data["nom"])

    Maintenant, tu n'es plus obligé d'utiliser eval. ton code pourrait devenir ceci
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    with open(file , 'r') as fp:
        for  lig in fp:
              detail_command = lig.split()
              for (i, elt) in  enumerate(detail_command):
                   if re.match(r"^\$", elt):
                        detail_command[i] = self.data[elt[1:]]
              # for
              command = " ".join(detail_command)
              print(command)
        # for
    # with
    ...
    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]

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 26/04/2010, 09h54
  2. variable dans variable
    Par gy0m76 dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/12/2006, 10h51
  3. Variable dans variable
    Par Bobybx dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 07/07/2006, 14h35
  4. $_POST[variable] ou $variable dans lien de confimation ?
    Par psychoBob dans le forum Langage
    Réponses: 6
    Dernier message: 09/05/2006, 14h08
  5. variable dans variable boucle
    Par molesqualeux dans le forum C
    Réponses: 2
    Dernier message: 26/12/2005, 16h02

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