我在类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