-
Effective python ch20. None보다는 예외를뜯고 또 뜯어보는 컴퓨터/파이썬 (Python) 2021. 7. 29. 23:25반응형
- 다음과 같은 예가 있다고 해보자. ZeroDivisionError가 발생했으므로, 0 보다는 None을 반환하는 것이 자연스러워보인다. 하지만 반환한 결과( == None 을 의미) 를 사용하는 if 문등의 조건에서 평가할때, None이 문제를 야기할 수 있으므로, 이를 살펴보자 (0이나 ""가 문제가 될 수 있음)
In [1]:def careful_device(a,b): try: return a/b except ZeroDivisionError: return None
In [2]:# 적절히 해석하였을시. x, y = 1, 0 result = careful_device(x,y) if result is None: print("잘못된 입력")
잘못된 입력
In [3]:# 잘못 사용된 예시. x, y = 0, 5 result = careful_device(x,y) if not result: print("잘못된 입력") # 원하는 결과는 None을 받아 실행이 안되길 원하는 함수인데, 실행이 되버렸다.
잘못된 입력
- 다음과 같은 상황을 해결하기 위한 해결책으로 저자는 다음과 같은 해결책을 제시해준다.
- 반환값을 False, None 등과 같이 2-튜플 형태로 반환.
- 계산에 성공한 경우 실제값을 저장하는 경우
In [4]:# 첫번째 경우 def careful_device(a,b): try: return True, a/b except ZeroDivisionError: return False,None
In [5]:success, result = careful_device(x,y) if not success: print("잘못된 입력")
- 여기서 저자는 파이썬의 관례중 하나인 첫번째 변수를 _로 무시할 수 있는점에 대해 지적하고 있는데, 이를 통해 실수할 가능성이 높아진다 지적하고 있다. (앞의 변수를 _ 로 생략해 버리면 False, True 값을 생략해서 None을 사용하게 됨,)
- 대신 저자는 절대 None을 반환하지 말도록 충고하고 있다. 대신 Exception Error 를 발생시켜, 호출한 쪽에 입력값이 잘못됐음을 알리는 것이 낫다고 말하고 있다.
In [6]:# 저자가 말하는 최종 값 ---> Exception Error를 발생시키는 함수. def careful_device(a,b): try: return a/b except ZeroDivisionError: raise ValueError("잘못된 입력")
In [9]:# 다음과 같이 잘못 되었을시에는 ValueError 출력 x,y = 5, 2 try: result = careful_device(x,y) except ValueError: print('잘못된 입력') else: print(f"결과는 {'%.1f'%result} 입니다.")
결과는 2.5 입니다.
결론 : None을 반환하기 보다는 Exception Error 를 발생시키고, 이를 독스트링(Docstring)에 잘 명시를 할 수 있도록 한다.¶
- 파이썬의 정적 타입 지정(typing)을 통해 타입 애노테이션에서도 적용할 수 있도록한다,
- 예외에 대한 정보는 Docstring 에 자세히 적도록 한다.
In [10]:def careful_device(a : float, b: float) -> float: """ a를 b로 나눈다. Raises: ValueError: b가 0이어서 나눗셈을 할 수 없을 떄 """ try: return a/b except ZeroDivisionError as e: raise ValueError("잘못 된 입력")
In [13]:result = careful_device(5,0) if not result: print("잘못된 입력")
--------------------------------------------------------------------------- ZeroDivisionError Traceback (most recent call last) <ipython-input-10-b9e563acea93> in careful_device(a, b) 7 try: ----> 8 return a/b 9 except ZeroDivisionError as e: ZeroDivisionError: division by zero During handling of the above exception, another exception occurred: ValueError Traceback (most recent call last) <ipython-input-13-59efcfe8aed7> in <module> ----> 1 result = careful_device(5,0) 2 if not result: 3 print("잘못된 입력") <ipython-input-10-b9e563acea93> in careful_device(a, b) 8 return a/b 9 except ZeroDivisionError as e: ---> 10 raise ValueError("잘못 된 입력") ValueError: 잘못 된 입력
반응형'뜯고 또 뜯어보는 컴퓨터 > 파이썬 (Python)' 카테고리의 다른 글
Efficient python Ch24. 동적인 디폴트 인자 관리법 (0) 2021.07.31 Efficient Python 23. 키워드 인자 사용법 (0) 2021.07.30 Efficient Python 22. 변수위치 인자(*Args) 사용법 (0) 2021.07.30 Effective Python 21. 클로져란 (0) 2021.07.30