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

Python 如何在循环中使用非类型函数调用生成器类型函数?,python,class,generator,yield,Python,Class,Generator,Yield,我在类读取器中有一个生成函数getElements,它生成xml文件中的所有元素。我还希望有一个函数getFeatures,它只生成带有feature标记的元素 我是如何尝试的,只有当调用getFeatures时才将标志特性设置为True,并且在getFeatures中调用self.getElements,如下所示: def getFeatures(self): self.getFeaturesOnly = True self.getElements() 这样在getEleme

我在类读取器中有一个生成函数getElements,它生成xml文件中的所有元素。我还希望有一个函数getFeatures,它只生成带有feature标记的元素

我是如何尝试的,只有当调用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不包含收益率。现在,我知道如何解决这个问题的方法是将getElements的代码复制到getFeatures中,并且只使用

if elementFunctions.getElmentTag(element) == 'feature':
在getFeatures函数中,但我不想复制任何代码。那么,我怎样才能继续使用生成器函数,并使用一个不同的函数,在这个函数中,我只指定要获取的标记?

首先要做的事情是:由于没有返回生成器,所以出现了该错误

这意味着你必须改变:

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

清除这个,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
第一件事:你有这个错误,因为你没有返回发电机

这意味着你必须改变:

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

清除这个,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
得到TypeError的原因不是getFeatures不包含yield,而是因为getFeatures不返回任何内容。如果希望getFeatures返回getElements返回的迭代器,则必须使用return:

当你这样做的时候,如果expr==True,你真的不应该这样做;只需执行if expr,即使expr在概念中为true,但在对象中为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()
得到TypeError的原因不是getFeatures不包含yield,而是因为getFeatures不返回任何内容。如果希望getFeatures返回getElements返回的迭代器,则必须使用return:

当你这样做的时候,如果expr==True,你真的不应该这样做;只需执行if expr,即使expr在概念中为true,但在对象中为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()