如何在循环中使用非类型函数调用生成器类型函数?

时间:2012-02-17 10:34:03

标签: python class generator yield

我在类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()函数中,但我不会复制任何代码。那么我怎样才能继续保持生成器功能,并且具有不同的功能,我只能识别我想要的标签?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

获得TypeError的原因不是getFeatures不包含收益,而是因为getFeatures 不会返回任何内容。如果您希望getFeatures返回getElements返回的迭代器,则必须使用return

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

当你在这里时,你真的不应该if expr == True;只做if expr,即使expr为真(概念)但不是True(对象)也可行。这就是说,而不是仅仅将功能支持提升到{{1}更常见的方法是在getElements本身中执行此操作,如下所示:

getFeatures