我在类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':
答案 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