2012-02-17 63 views
1

我在類Reader()中生成一個生成器函數getElements,該類生成xml文件中的所有元素。我也想要一個getFeatures函數,它只能生成帶有特徵標籤的元素。如何在循環內使用nonetype函數調用生成器類型函數?

我多努力,它是有一個設置爲True時getFeatures被稱爲標誌featuresOnly,並在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

()函數,但我寧願不重複的任何代碼。那麼,如何才能夠保持發電機功能,並且具有不同的功能,我只能說明我希望得到哪個標籤?

回答

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 
+0

謝謝,工作! – 2012-02-17 10:48:56

2

的原因,你得到了TypeError不是getFeatures不含一個收益率,這是因爲getFeatures不會返回任何東西。如果你想getFeatures返回迭代器getElements回來了,你必須使用return

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

當你在這,你真的不應該做if expr == True;只是做if expr,即使expr是真實的(概念),但不是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() 
+0

謝謝,工作! – 2012-02-17 10:48:15