我在类Reader()中有一个生成器函数getElements,该函数可以将所有元素从xml文件中导出。我还想拥有一个功能getFeatures,该功能仅产生带有功能标签的元素。

我的尝试方式是有一个标志featuresOnly,该标志在调用getFeatures时设置为True,在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()函数中,但我宁愿不重复任何代码。那么,我如何才能继续使用生成器功能,而又拥有一个仅指定要获取哪个标签的功能呢?

最佳答案

第一件事:您有该错误,因为您没有返回生成器

意味着您必须更改:

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

09-11 20:40