2013-08-03 4 views
0

Python을 배우기위한 일환으로 기사 텍스트를 반환하는 MediaWiki API에 대한 래퍼를 작성하고 있습니다. 여기 자체 내에서 함수 호출하기

는 기사를 검색하는 기능입니다 :

def article_search(self, search_terms): 
    url = self.article_url % (self.language, search_terms) 
    response = requests.get(url) 
    tree = html.fromstring(response.text) 

    results = tree.xpath('//rev[@contentmodel='wikitext']/text()') 
    test_redirect = re.search('\#REDIRECT', str(results)) 

    if test_redirect: 
     redirect = re.search(r'\[\[([A-Za-z0-9_]+)\]\]', str(results)) 
     go_to = redirect.group(1) 
     article_search(go_to) 

    else: 
     return results 

의 목표 블록이 검색 결과 실제로 다른 페이지 (if test_redirect) 우리를 리디렉션하려고 있는지 확인하는 경우 - 다른 사람과 article_search(go_to)으로 리디렉션되는 페이지를 검색하십시오. 리디렉션되지 않는 페이지에서 코드를 실행하면 정상적으로 작동합니다. 그러나 에 리디렉션되는 페이지를 통해 실행하면 NameError: global name 'article_search' is not defined이됩니다. 나는 이것이 아마 초보자 질문이라는 느낌을 갖지만, 내가 뭘 잘못하고 있는지 정말로 모르겠다. 어떤 도움이 필요합니까?

+3

(그것을 가정하는 것은 이상한 StaticMethod를하지만, 인스턴스의 방법은 아닙니다). org/wiki/Recursion_ % 28computer_science % 29) 그리고'Python recursive function'을 위해 google을 사용할 수 있습니다. –

+0

전체 스택 추적을 보여줍니다. 항상 전체 스택 추적을 표시하십시오. – Marcin

답변

7

article_search은 (self을 사용했기 때문에) 클래스의 일부라고 가정합니다. 이 경우 당신은 다음과 같이 호출한다 : //en.wikipedia :

self.article_search(go_to) 

그것은 [재귀] (HTTP라고

+2

'staticmethod' 또는'classmethod' 인 경우,'self'는 거기에 속하지 않습니다. 클래스 메쏘드라면 클래스를 가리 키지 만, 관습에 따라'cls'라는 이름을 붙여야합니다. 또한, 클래스 메쏘드라면,'self.article_search'는 여전히 그것을 고쳐야합니다. – jpmc26

+0

@ jpmc26 충분히 공정합니다. 'classmethod'는 여전히 작동 할 것이므로 제거했지만 이상한'staticmethod' 일 수도 있습니다 (의심 스럽지만). – freakish

+1

'return'도 필요합니다 -'article_search'는'else' 브랜치에서 값을 반환합니다. – RichieHindle