2013-05-14 1 views
6

튜플 또는 없음을 반환하는 함수가 있습니다. 발신자는 어떻게 그 상태를 처리해야합니까?파이썬 함수에서 반환 된 빈 (없음) 튜플을 처리하는 방법

def nontest(): 
    return None 

x,y = nontest() 

Traceback (most recent call last): 
File "<stdin>", line 1, in <module> 
TypeError: 'NoneType' object is not iterable 
+3

가능한 경우 가장 좋은 방법은 호출 된 함수를 변경하여 항상 튜플 (아마도 'None, None')을 반환하도록하는 것입니다. – Elazar

+0

함수가 'None'을 반환하면 어떻게할까요? 이 경우'x'는 무엇이되어야합니까? 이 경우에'y'가 무엇이되어야합니까? 'x'와'y'를 사용하는 현재의 계산을 계속하기 원하십니까? –

답변

10

EAFP :

res = nontest() 

if res is None: 
    .... 
else: 
    x, y = res 
+0

[PEP 3132] (http://www.python.org/dev/peps/pep-3132/)는 어떻습니까? 어떻게 든 관련성이 있습니까? – Elazar

+0

(아직) OP가 Python3.x를 의미한다고 생각할 수 있는지 확신 할 수 없습니다. – Anthon

+0

3.x의 경우에도 여기서는 관련이 없다고 생각합니다. 먼저,'x, * y = nontest()'라고 써야하고,'y'가 비어 있으면'None'-thing을하고, 그렇지 않으면'y = y [0]'를 써라. 두 가지 옵션 중 하나처럼 깨끗합니다. 그러나 더 중요한 것은'x, * y = nontest()'는 여전히'None'에서 실패 할 것입니다; 대신에'nontest'를'return'None,')으로 변경해야합니다. 어느 시점에서 '반환 없음, 없음'을 선택하면 확장 패키지를 열 필요가 없습니다. – abarnert

5

당신은 함수 자체를 변경할 수 있다면, 그것은 더 나은 아이디어 아마이 관련 예외를 대신 제기 할 :

try: 
    x,y = nontest() 
except TypeError: 
    # do the None-thing here or pass 

또는 예외 처리없이

None을 반환하여 오류 조건을 알리는 것. 그러면 발신자는 try/ except입니다.

None이 오류 조건을 나타내는이 아닌 경우 의미를 다시 생각해 보시기 바랍니다.

+2

아니면, 아무 것도 반환하지 않는 것이 적절하다면'None, None '대신에'None' 대신에 2-tuple이라는 값을 반환해야합니다. – abarnert

+0

또한'try' /'catch'가 아닌'try' /'except'입니다. – abarnert

+0

@abarnert : 당신 말이 맞아요. 나는 반세기 만에 자바를 만지는 일조차 해본 적이 없지만 아직도 나를 괴롭힌다. – Cairnarvon

6

방법에 대해 :

x,y = nontest() or (None,None) 

nontest 경우이 같은 두 항목 튜플, 다음 x와 y는 튜플의 항목에 할당해야 반환합니다. 그렇지 않으면, x와 y는 각각 none에 할당됩니다. 단점은 비 테스트가 비어있는 경우 특수 코드를 실행할 수 없다는 것입니다 (위의 답변이 목표에 도움이 될 수 있음). 단점은 깨끗하고 읽기/유지하기 쉽다는 것입니다.

관련 문제