Language/Python

[Effective Python] Better way 5. 복잡한 식을 쓰는 대신 도우미 함수를 작성하라

dashwood 2022. 8. 18. 20:58

[Effective Python] Better way 5. 복잡한 식을 쓰는 대신 도우미 함수를 작성하라

 

다음과 같이 URL의 질의 문자열(query string)을 parsing 한다고 가정하자.

from urllib.parse import parse_qs

my_values = parse_qs('빨강=5&파랑=0&초록=',
					keep_blank_values=True)
print(repr(my_values))

>>>
{'빨강': ['5'], '파랑': ['0'], '초록': ['']}

 

일부 질의 문자열 파라미터는 여러 값이 들어 있고, 일부 파라미터는 값이 하나만 들어 있으며, 이름은 있지만 값이 비어있거나, 아예 없을 수도 있음

결과 딕셔너리에 get 메서드를 사용하면 상황에 따라 다른 값이 반환됨.

print('빨강:', my_values.get('빨강'))
print('초록:', my_values.get('초록'))
print('투명도:', my_values.get('투명도'))

>>>
빨강: ['5']
초록: ['']
투명도: None

파라미터가 없거나 비어 있을 경우 0이 디폴트 값으로 대입되면 좋을 것

 

빈 문자열, 빈 리스트, 0 이 모두 암시적으로 False로 평가된다는 사실을 이용하여 다음과 같이 쓸 수 있음

red = my_values.get('빨강', [''])[0] or 0
green = my_values.get('초록', [''])[0] or 0
opacity = my_values.get('투명도', [''])[0] or 0
print(f'빨강: {red!r}')
print(f'초록: {green!r}')
print(f'투명도: {opacity!r}')

>>>
빨강: '5'
초록: 0
투명도: 0

 

그러나 위의 코드는 읽기 어렵다.

 

 

res_str = my_values.get('빨강', [''])
red = int(red_str[0]) if red_str[0] else 0

or

green_str = my_values.get('초록', [''])
if green_str[0]:
	green = int(green_str[0])
else:
	green = 0

위와 같이 boolean 연산자나 or나 and를 식에 사용하는 것 보다 if/else 식을 쓰는 편이 더 가독성이 좋다.

 

이러한 로직을 반복 적용하기 위해 아래와 같은 도우미함수를 작성해야 한다.

def get_first_int(values, key, default=0):
    found = values.get(key, [''])
    if found[0]:
        return int(found[0])
    return default