2012-02-17 3 views
1

xml 파일에서 모든 요소를 ​​산출하는 Reader() 클래스에서 getElements 생성기 함수가 있습니다. 또한 기능 태그가있는 요소 만 생성하는 getFeatures 함수가 필요합니다.루프 내에서 유형이없는 함수로 생성기 유형 함수를 호출하는 방법은 무엇입니까?

나는 getFeatures를 호출 할 때 True로 설정되는 플래그 featuresOnly을 가지고, 그리고 시도하는 방법 getFeatures이 같은 self.getElements 전화에 :) (getElements에

def getFeatures(self): 
    self.getFeaturesOnly = True 
    self.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가 포함되어 있지 않기 때문입니다. 지금,이 문제를 해결하는 방법을 알고있는 방법은 getFeatures에 getElements의 코드를 복사 만 getFeatures의

if elementFunctions.getElmentTag(element) == 'feature': 

() 함수를 사용하는 것입니다,하지만 난 오히려 코드를 복제 할 수 없습니다. 그렇다면 어떻게 발전기 기능을 유지할 수 있고, 어떤 태그를 얻고 싶은지에 대해 다른 기능을 사용할 수 있습니까?

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

로 :

def getFeatures(self): 
    self.getFeaturesOnly = True 
    return self.getElements() # returning the generator 

클리어

답변

3

중요한 것부터 먼저 : 당신은 당신이 변화해야한다는 의미 발전기

을 반환하지 않기 때문에 당신은 그 오류를 이것, TBH 내 Reader() 클래스를 디자인하지 않을 것입니다.

def getElements(self): 
    inFile = open(self.path) 
    for element in cElementTree.iterparse(inFile): 
     yield element 
    inFile.close() 

그리고 getFeatures() 필터링을 수행합니다 : 당신이 TypeError 포함하지 않는 getFeatures하지 얻을

def getFeatures(self): 
    for element in self.getElements(): 
     if element.tag == 'feature': 
      yield element 
+0

감사합니다. –

2

이유를

나는 getElement이 모든 요소를 ​​산출 할 것 수확량, getFeatures은 아무 것도 반환하지 않습니다.. 당신이 반복자가 getElements에 의해 반환 반환 getFeatures을 원하는 경우에, 당신은 return 사용해야합니다 : 당신이 그것에 인 동안, 당신이 정말로 if expr == True을하지 말아야

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

을; 즉 if exprexpr이 참 (개념)이지만 실제로는 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

감사합니다. –

관련 문제