2010-12-20 23 views
0

definieren Ich versuche, einige xml dieses Stück Code zu schreibenProblem mit Variablen in Python

docs = XmlReportGenerator() 
docs.AddMatchRow('FC Barcelona','Madryt','5:0') 
docs.Save() 

und ich schrieb meine eigene Methode:

from lxml import etree 

class XmlReportGenerator: 
    """""" 
    root = etree.Element('results') 
    doc = etree.ElementTree(root) 

    #---------------------------------------------------------------------- 
    def __init__(self): 

     """""" 

    def AddMatchRow(self,teamA,teamB, score): 
     pageElement = etree.SubElement(root,'Flight',teamA, teamB, score) 

     """""" 

    def Save(self,path = None): 
     outFile = open('Matches.xml', 'w') 
     doc.write(outFile) 

Nameerror: global name 'root' globale Namen ‚doc‘ ist nicht definiert Prozess Termi: nicht Verfahren beendet mit einem Beendigungscode von 1 getan

Nameerror definiert nated mit einem Exit-Code von 1 erledigt

Fehle ich etwas? Ich bin ein Neuling in Python (ich habe mehr Erfahrung in C#).

+0

Wenn Sie ohne Kommentare Code zu schreiben sind sowieso, hat es keinen Sinn es mit '„“„“„“' Spamming. Fügt nichts hinzu und wird im Fall von 'AddMatchRow' nicht einmal als pydoc gezählt (nach einigen Anweisungen). Verwenden Sie '# comment', wenn Sie eine visuelle Trennung wünschen. – viraptor

Antwort

3

Python ist explizit. Instanzvariablen müssen mit self. vorangestellt werden. Klassenvariablen müssen mit dem Namen der Klasse vorangestellt werden.

Hier ist eine feste Version. Die ursprüngliche SubElement Anruf war falsch, wie gut:

from lxml import etree 

# derive from 'object' if Python 2.X (it is default in Python 3.X) 
class XmlReportGenerator(object): 

    def __init__(self): 
     # clearer to init instance variables here. 
     self.root = etree.Element('results') 
     self.doc = etree.ElementTree(self.root) 

    def AddMatchRow(self,teamA,teamB, score): 
     # Need self.root here 
     pageElement = etree.SubElement(self.root,'Flight') 
     # Added data elements (or did you want attributes?) 
     etree.SubElement(pageElement,'teamA').text = teamA 
     etree.SubElement(pageElement,'teamB').text = teamB 
     etree.SubElement(pageElement,'score').text = score 

    def Save(self,path = None): 
     outFile = open('Matches.xml', 'w') 
     # Need self.doc here 
     self.doc.write(outFile) 

# This code will run if the script is executed directly, 
# but will be skipped if the script is imported by another script. 
if __name__ == '__main__': 
    docs = XmlReportGenerator() 
    docs.AddMatchRow('FC Barcelona','Madryt','5:0') 
    docs.Save() 
2

self gibt es aus einem Grund. Verwenden Sie self.root, nicht root

+1

'XmlReportGenerator.root' – khachik

+1

@khachik oder das, abhängig vom Kontext. Im Allgemeinen "self.root" –