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 :

faire un dictionnaire {'var1':var1}


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Par défaut faire un dictionnaire {'var1':var1}
    Bonjour,

    Je débute en Python et cherche à ecrire une fonction qui prend comme argument une serie de variables et les mets dans un dictionnaire pour ensuite pouvoir les sauver avec cPickle.
    L'idée est d'avoir une fonction save(file,var1,var2,var3,...)
    qui ferait un dictionnaire avec toutes les variables (sauf file) et me le sauverait dans... file.

    Je pense donc à un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    def save(file,*args)
       dico={'var1':var1...} #c'est la que ca coince
       cPickle.dump(dico, open(file, "wb"),protocol=2)
       close(file)
    Il me faut donc faire le dictionnaire avec comme cles les chaines de caractere des noms des variables qui passent comme args.
    Ça doit être tout bête...
    Saludos,
    Christophe

  2. #2
    Membre Expert 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
    Par défaut
    Bonjour,

    Tout dépend de la visibilité mais si var1 est dans le dico globals il te suffit de récupérer sa clé.

    Bon code

  3. #3
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    qui ferait un dictionnaire avec toutes les variables (sauf file) et me le sauverait dans... file.
    Comme l'a dit PauseKawa, il te suffit de récupérer le dictionnaire globals() (dictionnaire dans lequel est regroupé les variables du "niveau principal"), d'en faire une copie (une vraie), puis de passer ceci en argument à ta fonction

    ex:
    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 save(filename,**kwargs): #kwargs sera un dico et non une liste
       cPickle.dump(kwargs, open(filename, "wb"),protocol=2)
     
    if __name__=='__main__':
        #soluce 1 : ne pas déclarer file, et passer directement filename en argument a save sans le déclarer au niveau principal
        save( 'fooooooo', **globals()) # **globals() permet de passer le contenu de globals() comme si nous avions écrit " var1=56, var2='abc' "
     
        #soluce 2 : déclarer filename après avoir récupéré une COPIE de globals
        dico    = globals().copy() #recuperer une copie de globals
        filename = 'fooooo'
        save(filename, **dico)
     
        #soluce 3 : enlever la/les variables non désirée(s) de la COPIE de globals
        filename = 'fooooo'
        dico    = globals().copy() #recuperer une copie de globals
        del dico['filename']
        save(filename, **dico)
    Ceci étant dit, tu ne passes pas un objet fichier en argument, mais seulement le nom de ce dernier (c'est pourquoi j'ai renommer l'argument dans la fonction), donc tu peux très bien l'inclure dans les variables à pickler sans que cela soit gênant

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Par défaut pas toutes les variables
    Bonjour,

    Merci pour l'aide avec la variable global, mais je ne souhaite pas sauver toutes les variables, juste certaines d'entre elles.
    Il doit bien y avoir un moyen d'obtenir sous forme de string le nom d'une variable, ça reglerait mon probleme.
    Merci encore,
    Christophe

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Par défaut
    OK, je pense avoir compris: si on passe par *args, alors on n'a pas dans la fonction les noms des variables, mais juste leurs valeurs. Il faut donc imperativement passer par **kwargs, et ça devient plus simple. Mais moins facile d'emploi... Voici ma solution, pour ceux que ça peut interesser, mais qui n'a plus rien a voir avec le titre du topic

    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
    def save(file,**kwargs):
        """
        Save some data in a file.
        Usage: save('misdatos.pypic',a=a,b=b,test=test)
        """
        import cPickle
        f=open(file,"wb")
        cPickle.dump(kwargs,f,protocol=2) 
        f.close
    def restore(file):
        """
        Read data saved with save function.
        Usage: datos = restore('misdatos.pypic')
        """
        import cPickle
        f=open(file,"rb")
        result = cPickle.load(f)
        f.close
        return result

  6. #6
    Membre émérite
    Homme Profil pro
    heu...
    Inscrit en
    Octobre 2007
    Messages
    648
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : heu...

    Informations forums :
    Inscription : Octobre 2007
    Messages : 648
    Par défaut
    ***édité***

    Hmm, il y a aussi la fonction eval qui te permet d'évaluer une expression et de te retourner le résultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    def save(filename,*args):
        #-----------------------------------------
        #en version rapide :
        dico={name:eval(name) for name in args}
        #ou en version longue
        dico={}
        for name in args:
            dico[name]=eval(name)
        #-----------------------------------------
        cPickle.dump(dico, open(filename, "wb"),protocol=2)

    Sinon, je te propose autre chose, ne connaissant rien au contexte : pourquoi ne pas directement déclarer les variables que tu veux pickler directement dans un dictionnaire ?

    EDIT : ah ben t'as trouvé finalement

    EDIT2: Dans la définition (déclaration ????) d'une fonction, *unNom permet d'écrire n valeurs lors de l'appel de la dite fonction, unNom sera alors une liste, composée des n valeurs. Tu as déjà compris que**unNom quand à lui donnera un dict.

    et cela marche dans le sens "inverse" également :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    >>> def foo(a,b,c): return a+b+c
     
    >>> args=[1,2,3]
    >>> foo(*args)
    6
    >>> kwargs={'a':1,'b':2,'c':3}
    >>> foo(**kwargs)
    6

  7. #7
    Membre du Club
    Inscrit en
    Octobre 2010
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 9
    Par défaut
    Oups, ça marche pas:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
         dico={name:eval(name) for name in args}
                                 ^
    SyntaxError: invalid syntax
    Et la version "longue" non plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        17     dico={}
         18     for name in args:
    ---> 19         dico[name]=eval(name)
         20     cPickle.dump(dico,f,protocol=2)
         21     f.close
     
    TypeError: eval() arg 1 must be a string or code object

Discussions similaires

  1. Réponses: 7
    Dernier message: 05/12/2008, 09h26
  2. Une variable dans un dictionnaire, et faire recherche
    Par ploop dans le forum Général Python
    Réponses: 4
    Dernier message: 30/06/2007, 19h01
  3. Faire un Dictionnaire en C. Comment faire?
    Par overdrive77310 dans le forum C
    Réponses: 78
    Dernier message: 24/06/2007, 00h51
  4. concaténation de variable var = var.var1
    Par lodan dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 01/04/2007, 12h25
  5. Réponses: 23
    Dernier message: 22/05/2006, 19h56

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