본문 바로가기

개발/파이썬

Python 함수에서는 언제 None 을 반환 하는 것이 좋을까?

반응형

python 함수에서 None 을 리턴 하는 방법 중 대개는 아래 3가지가 사용된다.

def main_case_1():
    return


def main_case_2():
    return None


def main_case_3():
    test_a = 1


if __name__ == '__main__':
    print(main_case_1())
    print(main_case_2())
    print(main_case_3())
# 결과 값

None
None
None

 

개인적으로는 return None / return 은 구분 없이 썼었던 것 같다.

아래 stackoverflow 링크에서는 None을 사용할 때와 사용하지 않을 때를 구분해서 말해준다.

 

return None 을 사용해야할 때,

FRUITS = {"banana", "apple"}


def get_some_fruit(fruit):
    if fruit in FRUITS:
        return fruit
    return None


if __name__ == "__main__":
    if get_some_fruit("banana") is not None:
        print("이것은 과일 입니다")
    else:
        print("이것은 과일이 아닙니다")

위 함수의 의도는 None 이 아닐 때 과일임을 나타내는 프린트 문을 출력하고, None 일 때는 과일이 아님을 나타내는 프린트 문을 출력 하고자 하는 것이다. 이럴 때는, 그냥 return 보다는 return None 을 써줘서 명시적으로 None 을 리턴 함을 알려주는 것이 좋다.

 

return 을 사용해야 할 때,

def find_prisoner_with_knife(prisoners):
    for prisoner in prisoners:
        if "knife" in prisoner.items:
            prisoner.move_to_inquisition()
            return # no need to check rest of the prisoners nor raise an alert
    raise_alert()

위 코드는 스택 오버플로우 예제를 그대로 가지고 왔다. 칼가진 감옥수를 찾는 함수인데, for loop를 돌면서, 탐색에 성공하면,  for문을 다 돌지 않고, return 을 통해서 break 한다 이 경우에는 리턴 되는 None이 따로 사용이 되는 것이 아닌, 단순히 early return 목적이기 때문에, 굳이 return None 을 사용할 필요는 없다.

 

return을 사용하지 않을 때,

def set_some_fruit(fruit):
    fruits = []
    if is_fruit(fruit):
        fruits.append(fruit)

이 경우에는 과일인지를 판별한 후, 과일이면 fruits 리스트에 넣는다. 이 연산이 끝난 이후에는 return을 따로 적어주지 않는데, 따로 return 이나 return None 을 적지 않아도 위 함수가 의도한 동작을 정상적으로 마친 것을 알 수 있다.

함수 이름의 측면에서 봤을 때, set을 하였는데, return을 하는 것은 좀 어색한 느낌도 든다. 또한 스택 오버플로우 상에서는 void 타입의 함수가 동작하는 것과 같다라는 설명을 해준다.

 

위의 규칙이 무조건 따라야하는 규칙은 아니지만, None을 어떻게 다룰지에 대한 어느정도의 가이드는 제공해 주는 것 같다.

 

참고

stackoverflow.com/a/15300671

 

return, return None, and no return at all?

Consider three functions: def my_func1(): print "Hello World" return None def my_func2(): print "Hello World" return def my_func3(): print "Hello World" They all appear to return None...

stackoverflow.com

 

반응형