티스토리 뷰
728x90
def careful_divide(a, b):
try:
return a / b
except ZeroDivisionError:
return None
x, y = 1, 0
result = careful_divide(x, y)
if result is None:
print('잘못된 입력')
# 잘못된 입력
x, y = 0, 5
result = careful_divide(x, y)
if not result:
print('잘못된 입력') # 이 코드가 실행되는데 사실 이 코드가 실행되면 안 됨
# 잘못된 입력
- False 와 동등한 반환 값을 잘못 해석하는 경우는 None 이 특별한 의미를 가지는 파이썬 코드에서 흔히 저지르는 실수다
- 그래서 careful_divide 와 같은 함수에서 None 을 반환하면 오류를 야기하기 쉽다.
- 실수할 가능성을 줄이는 방법은 두 가지다.
- 반환 값을 튜플로 분리하는 것
- 특별한 경우가 아니라면 절대 None 을 반환하지 않는 것
1. 반환 값을 튜플로 분리하기
- 튜플의 첫 번쨰 부분은 연산이 성공인지 실패인지를 표시하는 방법이다.
- 두 번째 부분은 계싼에 성공한 경우, 실제 결괏값을 저장한다.
def careful_divide(a, b):
try:
return True, a / b
except ZeroDivisionError:
return False, None
- 이 함수를 호출하는 쪽에서는 튜플을 언패킹해야 함
- 이로 인해 나눗셈 결과를 그냥 검사하지 못하고 항상 튜플에서 상태 부분을 살펴보게 함
success, result = careful_divide(x, y)
if not success:
print('잘못된 입력')
_, result = careful_divide(x, y)
if not success:
print('잘못된 입력')
- 이 방법의 문제점은 호출하는 쪽에서 튜플의 첫 번째 부분(변수를 사용하지 않고 _ 밑줄로 표시하는 관례)을 쉽게 무시할 수 있다는 것이다.
2. None을 반환하지 않기
- 대신 Exception 을 호출한 쪽으로 발생시켜 호출자가 이를 처리하게 하기
- ZeroDivisionError 가 발생한 경우, 이를 ValueError 로 바꿔 던져 호출한 쪽에 입력 값이 잘못됐음을 말함
def careful_divide(a, b):
try:
return a / b
except ZeroDivisionError as e:
raise ValueError('잘못된 입력')
- 호출자는 더 이상 반환 값에 대한 조건문을 사용하지 않아도 됨
- 반환 값이 항상 올바르다고 가정하고, try 문의 else 블록에서 이 값을 즉시 사용할 수 있음
x, y = 5, 2
try:
result = careful_divide(x, y)
except ValueError:
print('잘못된 입력')
else:
print('결과는 %.1f 입니다' % result)
# 결과는 2.5 입니다
- 타입 애너테이션을 사용하는 코드에서 적용 가능
- 함수의 반환 값이 항상 float라고 지정할 수 있고, None이 반환되지 않음을 알릴 수 있다.
def careful_divide(a: float, b: float) -> float:
"""a를 b로 나눈다.
Raises:
ValueError: b가 0이어서 나눗셈을 할 수 없을 때
"""
try:
return a / b
except ZeroDivisionError as e:
raise ValueError('잘못된 입력')
- 이제 입력, 출력, 예외적인 동작이 모두 명확해지고, 호출자가 이 함수를 잘 못 처리할 가능성이 낮아짐
정리
- None은 False 로 잘못 인식될 수 있음
- None 대신 예외를 발생시키기
- None 을 절대 반환하지 않겠다는 걸 타입 애너테이션으로 명시할 수 있음
728x90
'Skills > Pythons' 카테고리의 다른 글
[Python] Jupyter module - %load_ext autoreload %autoreload 2 (0) | 2022.12.23 |
---|---|
[Python] from __future__ import print_function (0) | 2022.12.23 |
[Python] 딕셔너리 - defaultdict의 사용 (0) | 2022.12.08 |
[Python] dictionary 딕셔너리 - in, KeyError, get, setdefualt 메서드 (0) | 2022.12.07 |
[Python] Byres, Str의 차이 (2) | 2022.11.25 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- Unsupervised learning
- 도커 컨테이너
- 퓨샷러닝
- 딥러닝
- cs231n
- CNN
- clip
- 구글드라이브다운
- 데이터셋다운로드
- few-shot learning
- 프롬프트
- prompt learning
- vscode 자동 저장
- style transfer
- 구글드라이브서버다운
- stylegan
- 파이썬 클래스 계층 구조
- docker
- NLP
- 파이썬 딕셔너리
- support set
- 구글드라이브연동
- Prompt
- 도커
- 구글드라이브서버연동
- 파이썬
- 서버구글드라이브연동
- 파이썬 클래스 다형성
- python
- 서버에다운
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
250x250