들어가기 전
- 이 글은 이펙티브 파이썬을 공부하며 작성한 글입니다
- 코드 : https://github.com/chickenchickenlove/effective-python/tree/master/item16
요약
- 딕셔너리에 특정 Key에 접근해야하고, 특정 Key가 존재하지 않을 때 기본값을 정의하고 싶다면 항상 get()을 사용해라.
- sefdefault를 사용하는 것이 더 좋은 경우가 있다면, defaultdict을 사용해라.
Item16. 딕셔너리 Key에 대한 접근은 get을 사용하라
딕셔너리에서 특정 Key에 해당되는 Value를 불러온다고 가정해보자. 그러나 특정 Key가 딕셔너리에 없는 경우가 있을 수 있고, 이럴 때 '기본값'을 사용하고 싶을 때가 있다. 이런 경우를 다루기 위해서 크게 4가지 방법이 존재한다.
- 'in' 연산자를 이용해 Key가 존재하는지 살펴보기.
- KeyError를 Catch해서 처리하기
- sefdefault() 메서드를 이용하기
- get() 메서드를 이용하기
여기서 가장 좋은 방법은 get()을 이용하는 것이다. 그 이유는 가독성 관점에서 가장 좋고, 중복 대입도 발생하지 않기 때문이다. 그런데 어떤 경우에는 get()보다 setdefault()를 사용하는 것이 좋은 경우도 있을 수 있다. 그럴 때는 setdefault()를 사용하지 않고 defaultdict을 사용하는 것이 낫다. setdefault()는 메서드 이름과는 다르게 '기본값을 설정하고, 기본값을 반환'하는 작업을 하기 때문에 주의해서 읽지 않으면 이해하기 어려운 코드가 되기 때문이다.
결론만 이야기하면 딕셔너리에 특정 Key에 접근해야하고, 특정 Key가 존재하지 않을 때 기본값을 정의하고 싶다면 항상 get()을 사용해라.
코드로 살펴보기
# in을 이용해서 처리하는 방법
counters = {
'a': 1,
'b': 2
}
key = 'q'
if key in counters:
count = counters[key]
else:
count = 0
counters[key] = count + 1
먼저 'in'을 이용해서 처리하는 방법을 살펴보자. 이 코드에서는 count에 대한 대입식이 2번 나왔다. 만약 이런 코드가 정말 길어진다면, 심각한 가독성 저하를 불러 일으킬 것이다.
# KeyError를 이용하는 방법
counters = {
'a': 1,
'b': 2
}
key = 'q'
try:
counters[key] += 1
except KeyError as _:
counters[key] = 1
딕셔너리의 특정 Key에 접근했을 때 Key가 없는 경우, KeyError를 던지는데 이것을 Catch해서 기본값을 설정하는 방법이다. 그런데 이 역시 대입식이 두 번 발생하고, 심지어 의미를 이해하는 것은 'in'을 사용할 때 보다 더 복잡해졌다.
# get를 이용하는 방법
counters = {
'a': 1,
'b': 2
}
key = 'q'
count = counters.get(key, 0) + 1
counters[key] = count
마지막으로 get()을 이용하는 방법이다. 이 방법은 count에 대해 한번의 대입식만 사용되었으며, 코드도 가장 짧다. 또한 코드에서 나타내는 의미가 'Key에 대한 값을 가져오고 없으면 기본값으로 0을 설정해'로 명확하기 때문에 이해하기도 쉽다. 따라서 딕셔너리의 특정 Key에 접근해야하는 경우가 있다면, get()을 이용해 접근하는 것이 가장 좋다.
'프로그래밍 언어 > 파이썬' 카테고리의 다른 글
Effective Python Item 30. 리스트를 반환하기보다는 제너레이터를 사용하라 (0) | 2024.01.15 |
---|---|
Effective Python Item 29. 대입식을 사용해 컴프리헨션 안에서 반복작업을 피해라. (0) | 2024.01.14 |
Effective Python Item 10. 왈러스 연산자를 이용해 반복을 피하라 (0) | 2024.01.14 |
Effective Python Item 28. 컴프리헨션 내부에는 수식을 2개까지만 써라 (0) | 2024.01.13 |
Effective Python Item 45. 어트리뷰트를 리팩토링하는 대신 @property를 사용하라 (0) | 2024.01.13 |