2011-04-19 1 views
0

현재 XML (SVG)을 탐색하고 다음 문제가 있습니다.
내 함수는 항상 if currNode.parentNode is rootNode: 이후에 없음을 반환합니다. 아래 코드는 비어 있지 않은 문자열 인 'flag'에 대한 반환을 명시 적으로 설정했습니다.
여기에서 가장 흥미로운 부분은 print('...')이 3 개의 점을 인쇄하므로 문제가 정확히 존재한다는 것입니다 (또는 적어도 그렇게 보입니다).'반환'없음 '없음'표현 목록이 '없음'을 반환합니다.

파이썬 문서에 따르면 '표현식 목록이있는 경우 평가되고 그렇지 않으면 없음으로 대체됩니다.'

즉, 질문은 다음과 같습니다.
왜 'return'은 'flag'문자열을 반환하지 않고 'None'을 반환합니까? 업체에 따르면, 하나의 설명이

 
def relsLookup(currNode, rootNode): 
    if currNode.nextSibling is not None: 
     currNode = currNode.nextSibling 
     return currNode 
    elif currNode.nextSibling is None: 
     if currNode.parentNode is rootNode: 
      flag = 's2s_exception_end_of_svg' 
      print('...') 
      return flag 
     elif currNode.parentNode.localName == 'g': 
      if currNode.parentNode.nextSibling is not None: 
       print('<--') 
       currNode = currNode.parentNode.nextSibling 
       return currNode 
      elif currNode.parentNode.nextSibling is None: 
       print('<--') 
       currNode = currNode.parentNode 
       relsLookup(currNode, rootNode) 
     else: 
      flag = 's2s_exception_unknown_parent' 
      return flag 
    else: 
     flag = 's2s_exception_unknown_sibling' 
     return flag 

+0

'currNode.parentNode가 rootNode가 아닌 경우'? 그 때 무엇? 아니면'currNode.nextSibling이 None'이 아닌가? 그러면 어떻게됩니까? –

+0

전체 기능을 게시 할 수 있습니까? 중요한 부분은이 'if'블록이 입력되지 않으면 어떻게되는지입니다. –

+0

마지막 세 줄은 죽은 코드입니다. 값은 없음 또는 없음이며 세 번째 가능성은 없습니다. '무언가가없는 경우에 쓰십시오 : ... else : ... ' –

답변

6

을 나는 문제가 코드의 다음 부분 용의자 :

 elif currNode.parentNode.nextSibling is None: 
      print('<--') 
      currNode = currNode.parentNode 
      return relsLookup(currNode, rootNode) 

?

+0

솔직히? 나는 프로그래밍에 멍청하다. 그래서 정확하게 말할 수 없다 ... 나는 그것이 무엇을 반환한다고 생각하지는 않지만 생각한다. 그냥 재귀를해라. – 8day

+3

@a.reva : aix가 맞다. 거기에 리턴이 필요하다. 그렇지 않으면'relsLookup '에 대한 첫 번째 호출은이 경우'None'을 리턴한다. –

+0

@Jochen Ritzel : 문제는 반환 함수를 추가 한 후에 'relsLookup'을 호출하는 함수에서 오류가 발생한다는 것입니다. 두 경우 모두 내가 뭔가를 놓치고있어 ... – 8day

2

:

다음은이 코드 조각의 어느 currNode.nextSiblingNone가 아닌 경우, 혹은이지만, currNode.parentNode is rootNodeFalse입니다. 방법의 끝에 기본 반환 문을 설정/기능이 테스트 :

 elif currNode.parentNode.nextSibling is None: 
      print('<--') 
      currNode = currNode.parentNode 
      relsLookup(currNode, rootNode) 

당신이 말을 찾으 셨나요?

if currNode.nextSibling is None: 
    if currNode.parentNode is rootNode: 
     flag = 'end_of_svg' 
     print('...') 
     return flag 
    return 'nested if failed' 
return 'currNode.nextSibling is not None!!!' 
2

핵심 문제는 "끝에서 떨어지다"(즉, 값을 반환하거나 예외를 발생시키지 않고 코드 끝까지 도달하는) 함수는 암시 적으로 None을 호출자에게 반환한다는 것입니다.

따라서 Daren의 제안은 실제로 무슨 일이 일어나고 있는지를 알기 위해 명시 적으로 반환하고, 실제로 아무것도 반환하지 않는 재귀 사례를 지적합니다.

코드의 구조를 감안할 때 재귀 적 사례는 현재 값이 반환되지 않으므로 현재 깨져 있습니다.

관련 문제