2012-02-17 72 views
1

我在类Reader()中生成一个生成器函数getElements,该类生成xml文件中的所有元素。我也想要一个getFeatures函数,它只能生成带有特征标签的元素。如何在循环内使用nonetype函数调用生成器类型函数?

我多努力,它是有一个设置为True时getFeatures被称为标志featuresOnly,并在getFeatures调用self.getElements,像这样:

def getFeatures(self): 
    self.getFeaturesOnly = True 
    self.getElements() 

这种方式的getElements()我只要做

def getElements(self): 
    inFile = open(self.path) 
    for element in cElementTree.iterparse(inFile): 
     if self.getFeaturesOnly == True: 
      if element.tag == 'feature': 
       yield element 
     else: 
      yield element 
    inFile.close() 

然而,当我这样做,并运行它

features = parseFeatureXML.Reader(filePath) 
for element in features.getFeatures():# 
     print element 

我得到:TypeError:'NoneType'对象不可迭代 这是因为getFeatures不包含yield。现在,我知道如何解决这个问题的办法是的getElements的代码复制到getFeatures只有使用

if elementFunctions.getElmentTag(element) == 'feature': 
在getFeatures

()函数,但我宁愿不重复的任何代码。那么,如何才能够保持发电机功能,并且具有不同的功能,我只能说明我希望得到哪个标签?

回答

3

首先第一件事情:您有错误,因为你不回发电机

这意味着你必须改变:

def getFeatures(self): 
    self.getFeaturesOnly = True 
    self.getElements() 

有:

def getFeatures(self): 
    self.getFeaturesOnly = True 
    return self.getElements() # returning the generator 

清除这个,TBH我不会像这样设计我的Reader()班。

我让getElement产生的所有元素:

def getElements(self): 
    inFile = open(self.path) 
    for element in cElementTree.iterparse(inFile): 
     yield element 
    inFile.close() 

然后getFeatures()做过滤:

def getFeatures(self): 
    for element in self.getElements(): 
     if element.tag == 'feature': 
      yield element 
+0

谢谢,工作! – 2012-02-17 10:48:56

2

的原因,你得到了TypeError不是getFeatures不含一个收益率,这是因为getFeatures不会返回任何东西。如果你想getFeatures返回迭代器getElements回来了,你必须使用return

def getFeatures(self): 
    self.getFeaturesOnly = True 
    return self.getElements() 

当你在这,你真的不应该做if expr == True;只是做if expr,即使expr是真实的(概念),但不是True(该对象)。这就是说,而不是提升getElements的功能支持,更常见的方法是在getFeatures本身,如所以:

def getFeatures(self): 
    for element in self.getElements(): 
     if element.tag == 'feature': 
      yield element 

def getElements(self): 
    inFile = open(self.path) 
    for element in cElementTree.iterparse(inFile): 
     yield element 
    inFile.close() 
+0

谢谢,工作! – 2012-02-17 10:48:15