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 :

Problème d'argument par défaut


Sujet :

Python

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Par défaut Problème d'argument par défaut
    Bonjour !

    J'ai donc un problème, et je ne comprends vraiment, absolument pas d'où est-ce qu'il peut venir... J'ai essayé de faire une programmation plutôt propre, mais il reste sans doute des trucs un peu malhabiles...

    La classe dans laquelle j'ai mon problème permet de gérer des groupes de musiques, qui contiennent entre autres des membres (chacun pouvant avoir plusieurs instruments), et je sauvegarde les groupes créés en fichiers xml, que je récupère ensuite.
    Dans mes tests, je créée deux ou trois groupes, puis je créée un nouvel objet qui récupère les infos du fichier xml d'un des précédents pour en construire un objet équivalent. Pour cela, j'appelle entre autres le constructeur de classe sans argument... sauf que, pour une raison qui m'échappe complètement, l'un des arguments ne prend pas la valeur par défaut mais contient d'autres informations utilisées précédemment !

    Voici le code du test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
        band1 = Band("Adrana", {"Anae": [5], "Grhyll": [1,4]})
        band1.addMember("Emeric", [2])
        band1.addSong(21)
        band1.addSong(23)
        band2 = Band("Heavy Nuggets Cordons Bleus")
        band2.addMember("Nathan", [1,2,3])
        band2.addSong(11)
        band2.addMember("Fabien", [1,2,4])
        band1.addMember("Ludovic", [1])
        band3 = Band("Essai", {"Essai1": [19]})
        band3.addMember("Essai2", [8])
        band5 = Band().fromXml(1)
    Le code du constructeur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
        def __init__(self, name = "No name", pmembers = {}):
            self._id = Band.count
            self._name = name
            self._members = pmembers
            print("Initializing band nr {0}".format(Band.count))
            print(" Members: ")
            print(pmembers)
            self._songs = []
            if name != "No name":
                Band.count = Band.count+1
                countFile = open('countBand.txt', encoding='utf-8', mode='w')
                countFile.write("{0}".format(Band.count))
                countFile.close()
                self.save()
    J'imprime donc l'argument "pmembers" pour vérifier qu'il prend bien la valeur voulue, sauf que voici ce que le shell me refile... :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Initializing band nr 1
     Members: 
    {'Grhyll': [1, 4], 'Anae': [5]}
    Initializing band nr 2
     Members: 
    {}
    Initializing band nr 3
     Members: 
    {'Essai1': [19]}
    Initializing band nr 4
     Members: 
    {'Nathan': [1, 2, 3], 'Fabien': [1, 2, 4]}
    Lors de la quatrième initialisation, appelée sans paramètre, il me ressort Nathan et Fabien... Je ne comprends pas :/

    Si quelqu'un avait une idée, donc...


    Voici, au cas où, le code complet du fichier :

    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
    import xml.etree.ElementTree as etree
     
    class Band:
     
        countFile = open('countBand.txt', encoding='utf-8')
        count = int(countFile.read())
        countFile.close()
     
        def __init__(self, name = "No name", pmembers = {}):
            self._id = Band.count
            self._name = name
            self._members = pmembers
            print("Initializing band nr {0}".format(Band.count))
            print(" Members: ")
            print(pmembers)
            self._songs = []
            if name != "No name":
                Band.count = Band.count+1
                countFile = open('countBand.txt', encoding='utf-8', mode='w')
                countFile.write("{0}".format(Band.count))
                countFile.close()
                self.save()
     
        def save(self):
            #print("Saving {0}".format(self._id))
            fileName = "Bands/Band{0}.xml".format(self._id)
            saveFile = open(fileName, encoding='utf-8', mode='w')
            saveFile.write("<?xml version=\"1.0\" encoding=\"utf-8\"?>\n")
            saveFile.write("<Band>\n")
            saveFile.write("  <id>{0}</id>\n".format(self._id))
            saveFile.write("  <name>{0}</name>\n".format(self._name))
            saveFile.write("  <members>\n")
            for (name, instruments) in self._members.items():
                #print("  Saving " + name)
                saveFile.write("    <member name=\"{0}\">\n".format(name))
                for instr in instruments:
                    saveFile.write("      <instrument>{0}</instrument>\n".format(instr))
                saveFile.write("    </member>\n")
            saveFile.write("  </members>\n")
            saveFile.write("  <songs>\n")
            for song in self._songs:
                saveFile.write("    <song>{0}</song>\n".format(song))
            saveFile.write("  </songs>\n")
            saveFile.write("</Band>\n")
            saveFile.close()
     
        def fromXml(self,bandId):
            fileName = "Bands/Band{0}.xml".format(bandId)
            tree = etree.parse(fileName)
            root = tree.getroot()
            self._name = root.find("name").text
            membersNode = root.find("members").findall("member")
            for member in membersNode:
                instrumentsNode = member.findall("instrument")
                instrumentsList = []
                for instr in instrumentsNode:
                    instrumentsList.append(instr.text)
                #print("Adding member " + member.attrib["name"])
                self.addMember(member.attrib["name"], instrumentsList, 0)
            songsNode = root.find("songs").findall("song")
            for song in songsNode:
                self.addSong(song.text, 0)
            self._id = root.find("id").text
            self.save()
            return self
     
        def addMember(self, name, instruments, save = 1):
            self._members[name] = instruments
            if save == 1:
                self.save()
     
        def addSong(self, songId, save = 1):
            if not songId in self._songs:
                self._songs.append(songId)
                if save == 1:
                    self.save()
     
     
    if __name__ == '__main__':
        band1 = Band("Adrana", {"Anae": [5], "Grhyll": [1,4]})
        band1.addMember("Emeric", [2])
        band1.addSong(21)
        band1.addSong(23)
        band2 = Band("Heavy Nuggets Cordons Bleus")
        band2.addMember("Nathan", [1,2,3])
        band2.addSong(11)
        band2.addMember("Fabien", [1,2,4])
        band1.addMember("Ludovic", [1])
        band3 = Band("Essai", {"Essai1": [19]})
        band3.addMember("Essai2", [8])
        band5 = Band().fromXml(1)
        #print(band1._members)
        #print(band5._members)
        #band5.addSong(9999)
        #print(band1._members)
        #print(band5._members)
        #print("band1 : {0}".format(band1._id))
        #print("band2 : {0}".format(band2._id))
        #print("band3 : {0}".format(band3._id))

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    pmembers = {} est évalué une seule fois, ceux qu suivent sont des références ...
    comme pour les listes.
    essayes ça ...
    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
        def __init__(self, name = "No name", pmembers = None):
            self._id = Band.count
            self._name = name
            if pmembers == None: self._pmembers = {}
            else: self._members = pmembers
            print("Initializing band nr {0}".format(Band.count))
            print(" Members: ")
            print(pmembers)
            self._songs = []
            if name != "No name":
                Band.count = Band.count+1
                countFile = open('countBand.txt', encoding='utf-8', mode='w')
                countFile.write("{0}".format(Band.count))
                countFile.close()
                self.save()

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Par défaut
    Eh bien... Ca marche, merci ! Je n'ai pas tout à fait compris l'explication, du moins ça me paraît vraiment étrange, mais au moins je n'ai plus ce problème

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    159
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 159
    Par défaut
    Salut,
    Citation Envoyé par Grhyll Voir le message
    Je n'ai pas tout à fait compris l'explication, du moins ça me paraît vraiment étrange
    On en avait discuté par exemple ici http://www.developpez.net/forums/d95...t-ne-comprend/ (à partir d'une liste, mais c'est pareil avec un dict).
    Tu trouveras au début de ce fil des explications et des liens vers la doc de python qui explique un peu plus ce phénomène.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 6
    Par défaut
    Merci beaucoup, c'est déjà plus clair pour moi ! Ca me paraissait complètement aberrant... Et merci pour le flag "résolu", je n'ai pas trouvé comment le mettre moi-même (si tant est que ce soit possible).

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

Discussions similaires

  1. Problème avec argument par défaut de templates
    Par benlaug dans le forum Langage
    Réponses: 3
    Dernier message: 08/01/2012, 09h59
  2. Problème de timezone par défaut
    Par TiVoye dans le forum Collection et Stream
    Réponses: 4
    Dernier message: 10/07/2009, 09h48
  3. Réponses: 3
    Dernier message: 28/11/2008, 14h02
  4. Chaine littérale en tant qu'argument par défaut
    Par Daemonovae dans le forum C++
    Réponses: 3
    Dernier message: 24/11/2006, 20h27
  5. Réponses: 1
    Dernier message: 25/09/2006, 09h50

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