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을 어떻게 다룰지에 대한 어느정도의 가이드는 제공해 주는 것 같다.
참고
'개발 > 파이썬' 카테고리의 다른 글
[Effective Python] 19. 함수가 여러 값을 반환하는 경우 절대로 네 값 이상을 언패킹 하지 마라 (0) | 2021.01.03 |
---|---|
[SOLID] 파이썬 코드로 이해하는 SRP(Single Responsibility Principle) (0) | 2020.12.31 |