EXCELSIOR

BETTER WAY 4 - 복잡한 표현식 대신 헬퍼(Helper) 함수를 작성하자 본문

Python/Effective Python

BETTER WAY 4 - 복잡한 표현식 대신 헬퍼(Helper) 함수를 작성하자

Excelsior-JH 2018. 1. 29. 00:34

BETTER WAY 4 - 복잡한 표현식 대신 헬퍼(Helper) 함수를 작성하자

Item04 - Write Helper Functions Instead of Complex Expressions


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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# ex) URL에서 쿼리 문자열을 decode 하는 경우
#   - 각 쿼리 문자열 파라미터는 정수 값을 표현
from urllib.parse import parse_qs
 
# dictionary 형태로 반환
my_values = parse_qs('red=5&blue=0&green=', keep_blank_values=True)
print(repr(my_values))
 
# 쿼리 문자열 파라미터에 따라 값이 여러 개이거나
# 하나 이거나 파라미터는 존재하지만 값이 없거나
# 파라미터가 아예 빠져 있는 경우가 있을 수 있음
print('Red:    ', my_values.get('red'))
print('Green:  ', my_values.get('green'))
print('Opacity:', my_values.get('opacity'))
 
 
# 파라미터가 없거나 값이 없는 경우, default값으로 0을 할당
# 1. bool 표현식으로 처리
# 쿼리 문자열: 'red=5&blue=0&green='
red = my_values.get('red', [''])[0or 0 # => False일 경우 0 반환 
green = my_values.get('green', [''])[0or 0 # = my_values.get('green', 0)
opacity = my_values.get('opacity', [''])[0or 0
print('Red:    {!r}'.format(red)) # {!r} = repr
print('Green:   {!r}'.format(green))
print('Opacity: {!r}'.format(opacity))
 
# 위의 코드는 표현식이 읽기 어려울 뿐만 아니라 
# Red 같은 경우는 str을 반환하기 때문에 
# 추가적으로 아래와 같이 int로 변환해주어야 한다.
red = int(my_values.get('red', [''])[0or 0)
 
 
# 위의 코드는 복잡해 처음 읽는 사람은 이해 하는데 시간이 걸린다.
# 한 줄로 쓰는 것은 좋을 수 있지만 한 줄에 모든 코드를 집어 넣는건 큰 의미가 없음
# 2. if/else 조건식을 이용해 명확하게 표현
red = my_values.get('red', [''])
red = int(red[0]) if red[0else 0
print('Red:    {!r}'.format(red))
 
 
# 하지만 여러 줄에 걸친 if/else 문을 대체할 정도로 명확하지 않다.
# 그렇다고 이것을 다 펼치면 더 복잡해 보인다. 
green = my_values.get('green', [''])
if green[0]:
    green = int(green[0])
else:
    green = 0
 
 
# 이러한 로직을 반복해서 사용해야 할 경우 Helper 함수를 만드는 것이 좋다.
def get_first_int(values, key, default=0):
    found = values.get(key, [''])
    if found[0]:
        found = int(found[0])
    else:
        found = default
    return found
 
red = get_first_int(my_values, 'red')
print('Red:    {!r}'.format(red))
cs



정리

  • Python의 문법을 이용하면 한 줄짜리 표현식을 쉽게 작성할 수 있지만 코드가 복잡해지고 읽기 어려워짐
  • 복잡한 표현식은 헬퍼 함수로 옮기는게 좋음. 특히, 같은 로직을 반복해서 사용해야 할 경우
  • if/else 표현식을 이용하면 or나 and같은 bool연산자를 사용할 때보다 읽기 편한 코드를 작성할 수 있음


Comments