2013-10-12 81 views
0

我是python的新手。我想使这部分变量在函数中共享。Python:跨功能共享变量

 publist = [] 
    publication = {"pubid" : 1, "title" : 2, "year" : 3, "pubtype" : 4, "pubkey" :5} 
    article = False 
    book = False 
    inproceeding = False 
    incollection = False 
    pubidCounter = 0 

我在哪里放置这些变量。我已经尝试将它放置如下所示,但它表示有一个indendation错误。但是,将它们放在外面也会导致缩进错误。

import xml.sax 


class ABContentHandler(xml.sax.ContentHandler): 
    publist = [] 
    publication = {"pubid" : 1, "title" : 2, "year" : 3, "pubtype" : 4, "pubkey" :5} 
    article = False 
    book = False 
    inproceeding = False 
    incollection = False 
    pubidCounter = 0 

    def __init__(self): 
     xml.sax.ContentHandler.__init__(self) 

    def startElement(self, name, attrs): 

     if name == "incollection": 
      incollection = true 
      publication["pubkey"] = attrs.getValue("pubkey") 
      pubidCounter += 1 

     if(name == "title" and incollection): 
      publication["pubtype"] = "incollection" 



    def endElement(self, name): 
     if name == "incollection": 

      publication["pubid"] = pubidCounter 
      publist.add(publication) 
      incollection = False 

    #def characters(self, content): 


def main(sourceFileName): 
    source = open(sourceFileName) 
    xml.sax.parse(source, ABContentHandler()) 


if __name__ == "__main__": 
    main("dblp.xml") 

回答

2

当放置他们一样,你将它们定义为本地的类,所以你需要通过self

例如对它们进行检索

def startElement(self, name, attrs): 

    if name == "incollection": 
     self.incollection = true 
     self.publication["pubkey"] = attrs.getValue("pubkey") 
     self.pubidCounter += 1 

    if(name == "title" and incollection): 
     self.publication["pubtype"] = "incollection" 

如果你宁愿他们是全球性的,你应该定义它们的类外

1

当您将变量的类定义,你可以用这种方式引用这些变量:self.incollection(个体经营是类实例)。如果你不这样做(只需通过名称引用这些变量,如incollection),Python将尝试在全局范围内查找这些变量。因此,您可以将它们定义为全局变量,并在引用这些变量之前使用全局关键字:

global incollection 
incollection = true