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))